どのようにして定期的に引用符を変えることができます(つまり」、「)のLaTeX / TeXの引用符に(すなわち `」、` ` '')
質問
通常の引用符で書かれた文書を、与えられた例えばます。
Ben said "buttons, dear sir".
I replied "Did you say 'buttons'?" to him.
どのような方法1は、適切なセマンティクスで、LaTeXの引用符の中に、物事のこれらの並べ替えを有効にすることができます。すなわちます。
Ben said ``buttons, dear sir''.
I replied ``Did you say `buttons'?'' to him.
LaTeXのは、生成するようにます:
Ben said “buttons, dear sir”.
I replied “Did you say ‘buttons’?”
私が最初に考えたのは正規表現を有効にすることです。しかし、私はGoogleや正規表現のためのライブラリ「LaTeXの引用符、正規表現」から任意のヒットが届かない、そしてもちろん「TeXは、正規表現を引用し、」あまりにも多くを返すようです。
ありがとうございます。
解決
一般的に、この問題は見た目より難しいです。
最も簡単な例は、<全角> は、正規表現を用いて処理することができますが、より一般的な状況のため、あなたはほぼ確実に再帰的なパーサを構築する必要があります:何のネスティングがない場合、正規表現のみ動作します。
の大きな問題は、収縮が("'"
"don't"
のおよび、変更されるべきではないよう---ペアリングされていない識別単一squote
Sに関連付けされようとしています)ペアにするべきではありません。
私たちは、使用可能なEBNFの説明を記述することができるかどうかを確認できます。
input: text+
text: uquote|squote|dquote
squote "'" text "'"
dquote """ text """
uquote: [contraction|.]+
contraction: [A-Za-z]+ "'" [A-Za-z]+
単語の途中でdquote
を有する収縮に制限されます。関連するすべてのアクションがちょうど<=>と<=>用語を適宜引用符を置き換えることを除いて、入力をエコーされます。
私はかなり単純なワンオフのための人間のフィックスアップが続く正規表現を使用し、それは、進行中の作業のための労働集約的になります。
他のヒント
ここで私は私のLaTeX文書に使用するPythonの正規表現は、次のとおりです。
'([ \w-]+)'", " `\\1'
(ここのラテックスファイルに正規表現を適用するPythonスクリプトがあります)。ほとんどの時間を動作します。ハッピー組版! :)
ここでは、あなたがやりたいことのために十分であるかもしれないいくつかのPerlの正規表現の置換である。
s/"(\w)/``$1/g;
s/'(\w)/`$1/g;
s/([\w\.?!])"/$1''/g;
コードは英数字が続く単一または二重引用符は、引用符を開始することを前提としています。また、英数字または句読点以下の二重引用符は、引用符を終了することを前提としています。これらの仮定は、おそらくほとんどの時間を満たしているが、例外もあります。
の入力をありがとう - 。役に立つと感謝
私はまた、CPANの<のhref = "http://search.cpan.org/src/ANDREWF/LaTeX-Encode-0.03/lib/LaTeX/Encode.pm" のrel = "nofollowをから、この渡って来ていますnoreferrer ">ラテックス:: 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
タスクのこの種のための正規表現を使用しないでください!
たぶん、あなたは SmartyPants の?
からいくつかのインスピレーションを得ることができます私はこの問題への答えを探していて、今日はほとんどのLispを学ぶことを決定しました。私は私の〜/の.emacsファイルにこのLisp関数を配置し、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)))
単に、引用を開くために使用 ``と ''