该csquotes
包在输入中自动添加引号而不是愚蠢的引号方面做得很好。这在许多语言中都很有效(例如英语, 或者立陶宛语),但是有一种情况它目前无法处理。那就是当两个结束引号连在一起时的情况。在巴尔托-斯拉夫语中,例如拉脱维亚语、俄语或白俄罗斯语,这会导致引号不平衡,例如
работа В.И. Ленина «О карикатуре на марксизм
и об «империалистическом экономизме»
那是
The paper by V.I. Lenin «A caricature of Marxism
and «Imperialist Economism»
请注意有两个开头引语和一个结尾引语。
这里
\usepackage{csquotes}
\MakeOuterQuote{"}
...
работа В.И. Ленина "О карикатуре на марксизм
и об "империалистическом экономизме"
会导致
! Package csquotes Error: Unbalanced groups or invalid nesting.
我想出了一个小办法,似乎可以将引号正确地放置在我的文档中,但是如果有一个通用的解决方案就更好了。
答案1
以下是对我有用的方法。它基于以下观察:
结束引号后面跟着空格或标点符号,所有其他引号都是开始引号
可以使用不忽略空格的\new@ifnextchar
命令来实现此规则:amsgen.sty
\usepackage{amsgen}
\makeatletter
\def\smartquote{\new@ifnextchar\@sptoken{\rightquote}{%
\@ifnextchar.{\rightquote}{%
\@ifnextchar,{\rightquote}{%
\@ifnextchar){\rightquote}{\leftquote}}}}}
\def\leftquote{<<}
\def\rightquote{>>}
\makeatother
要将其绑定\smartquote
到双引号字符,可以使用使双引号有效的方法:
\newcommand{\setupsmartquotes}{%
\catcode`\"=\active %
\begingroup
\lccode`\~=`\"
\lowercase{\endgroup
\def~{\smartquote}}}
现在可以在使双引号有效的语言中和之后使用覆盖babel
定义。\setupsmartquotes
\AtBeginDocument
\selectlanguage
\AtBeginDocument{\setupsmartquotes}
这将产生预期的结果: