How can one turn regular quotes (i.e. ', ") into LaTeX/TeX quotes (i.e. `', ``'')

淺唱寂寞╮ 提交于 2019-12-03 13:43:02

问题


Given a document written with normal quotes, e.g.

Ben said "buttons, dear sir".
I replied "Did you say 'buttons'?" to him.

What ways can one turn these sort of things into LaTeX quotes, with the appropriate semantics. i.e.

Ben said ``buttons, dear sir''.
I replied ``Did you say `buttons'?'' to him.

So that LaTeX produces:

Ben said “buttons, dear sir”.
I replied “Did you say ‘buttons’?”

My first thought is to turn to a regex. However, I'm not getting any hits from Google or the regex libraries for "LaTeX quotes regular expression", and of course "TeX quotes regular expression" seems to return too many.

Thank you.


回答1:


In general, this problem is harder than it looks.

The simplest cases can be treated with regular expressions, but for more general situations you will almost certainly need to build a recursive parser: regular expression will only work if there is no nesting.

The big problem is going to be associated with identifying single "'"s that are not paired---as is contractions (the "'" in "don't" should not be changed, and should not be paired).


Lets see if we can write a usable EBNF description:

input:       text+
text:        uquote|squote|dquote
squote       "'" text "'"
dquote       """ text """
uquote:      [contraction|.]+
contraction: [A-Za-z]+ "'" [A-Za-z]+

which is limited to contractions that have the "'" in the middle of the word. All the associated action will just echo the input, except that the squote and dquote terms replace the quotes as appropriate.


I used regular expressions followed by human fix-ups for a fairly simple one-off, but that would be labor intensive for on-going work.




回答2:


Here is the python regex that I use for my Latex documents:

'([ \w-]+)'", " `\\1'

There is a python script that applies the regex on a latex file (here). Works most of the time. Happy typesetting! :)




回答3:


Here are some Perl regular expression substitutions that might be good enough for what you want to do.

s/"(\w)/``$1/g;
s/'(\w)/`$1/g;
s/([\w\.?!])"/$1''/g;

The code assumes that a single or double quote followed by an alphanumeric character begins a quote. Also, it assumes that a double quote following an alphanumeric character or punctuation mark ends a quote. These assumptions are probably true most of the time but there may be exceptions.




回答4:


Thanks for the input - helpful and appreciated.

I've also come across this, from CPAN's Latex::Encode.pm:

    # A single or double quote before a word character, preceded
    # by start of line, whitespace or punctuation gets converted
    # to "`" or "``" respectively.

    $text =~ s{ ( ^ | [\s\p{IsPunct}] )( ['"] ) (?= \w ) }
              { $2 eq '"' ? "$1``" : "$1`" }mgxe;

    # A double quote preceded by a word or punctuation character
    # and followed by whitespace or end of line gets converted to
    # "''".  (Final single quotes are represented by themselves so
    # we don't need to worry about those.)

    $text =~ s{ (?<= [\w\p{IsPunct}] ) " (?= \s | $ ) }
              { "''" }mgxe



回答5:


Do not use regular expressions for this kind of task!

Maybe you can get some inspiration from SmartyPants?




回答6:


I was looking for an answer to this problem and decided to learn a little lisp today. I put this lisp function in my ~/.emacs file and then run with M-x tex-set-quotes:

(defun tex-set-quotes ()  
  (interactive)  
  (latex-mode)  
  (while (search-forward "\"" nil t)  
   (replace-match "" nil t)  
   (tex-insert-quote nil)))



回答7:


Simply, use `` for opening quotations and '' for closing



来源:https://stackoverflow.com/questions/346567/how-can-one-turn-regular-quotes-i-e-into-latex-tex-quotes-i-e

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!