的一大特色csquotes
是,使用\MakeAutoQuote
,我们可以简单地输入正确的硬编码引号并完成csquotes
剩下的工作,即将它们转换为正确的格式(由语言、字体等定义),并处理嵌套:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[english]{babel}
\usepackage[babel]{csquotes}
\usepackage{lipsum}
\MakeAutoQuote{»}{«}
\MakeAutoQuote*{›}{‹}
\begin{document}
\lipsum*[1]
»\lipsum*[2] »[...]««
\lipsum*[3]
\blockquote{\lipsum*[2] »[...]«}
\end{document}
在我的文档中,我只使用»
+«
和›
+ ‹
(放在键盘上容易触及的位置),无论我用什么语言书写,无论引号在打印时需要是什么样子。Csquotes
都会将它们视为\enquote
s。这很完美……除非我们谈论的是较长的引文,我们希望它自动转换为块格式。我想要一个更智能的自动引文,它的行为像\blockquote
而不是\enquote
,即,如果预期长度达到某个阈值,它将切换到块格式。这样,我就可以在整个文档中统一使用»
和,«
而不必手动考虑引文的长度。
不幸的是,\MakeAutoQuote
似乎与 csquotes 文档的链接相当\enquote
紧密(§4.1)。有什么方法可以改变这种情况,目前我还不知道有哪些陷阱吗?
跟进
受@cfr 和 Ulrike 的回复启发,我想到了一个可能被一些人认为有点肮脏的解决方法(这个想法)。如果我们可以使用 来\mkblockquote
定义块引用的精确格式,为什么不改变我们活动的块引用字符的功能(例如»
和«
)开始之后块引用的每个实例——成为块引用中的活动文本引用字符?并在最后将块引用功能归还给他们?
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[english]{babel}
\usepackage[babel]{csquotes}
\usepackage{lipsum}
% define » and « to trigger a block quote
\MakeBlockQuote{»}{|}{«}
\renewcommand{\mkblockquote}[4]{%
% inside a block quote, make them trigger a text quote
\MakeAutoQuote{»}{«}%
#1#2#3#4%
% now they resume functioning as block quote triggers again
\MakeBlockQuote{»}{|}{«}
}%
\begin{document}
\lipsum*[1]
»\lipsum*[2]«
»\lipsum*[2] »[...]««
\lipsum*[3]
\end{document}
显然,它的工作方式并非如此。我曾希望\MakeBlockQuote
它能像 那样工作\renewcommand
,但csquotes
似乎不接受对活动 blockquote 字符的重新定义。即使这种构造也会导致“无效参数错误”:
\MakeBlockQuote{»}{|}{«}
\MakeBlockQuote{>}{|}{<}
就好像一旦定义,块引号就与这些字符密不可分了。或者我们有什么办法可以让它以某种方式工作?
答案1
也许我遗漏了什么,但为什么不定义要使用的活动字符\MakeBlockQuote
呢?我猜这不允许您具体指定内部/外部标记,但如果csquotes
无论如何都要处理嵌套,也许这不是什么大问题。(我定义了外部和内部,但实际上从未使用过内部标记,原因就在于此。)
\documentclass[british]{article}
\usepackage{babel}
\usepackage[utf8]{inputenc}
\usepackage{csquotes}
\usepackage{kantlipsum}
\MakeBlockQuote{<}{|}{>}
\begin{document}
\kant[2]
<\kant[1]>
\kant[3]
Some more text. <This is a short quote.>
`This is another short quote.'
\end{document}
最后的简短引述只是为了比较。
编辑
Ulrike Fischer 指出你不能嵌套块引用csquotes
(但你可以嵌套常规 LaTeX 块引用)。
您可以做的是将上述方法与常规活动引号字符的使用结合起来,这样csquotes
就可以正确地找出嵌套。这是否是一个重大的限制可能取决于您所做的工作类型。如果您经常需要排版包含其他块引用的块引用,这显然不是一个好的解决方案。如果这种情况相对罕见,也许就没那么好了。
\documentclass[british]{article}
\usepackage{babel}
\usepackage[utf8]{inputenc}
\usepackage{csquotes}
\MakeAutoQuote{‘}{’}
\MakeAutoQuote*{“}{”}
\usepackage{kantlipsum}
\MakeBlockQuote{<}{|}{>}
\begin{document}
\kant[2]
<\kant[1]>
\kant[3]
Some more text. <This ‘is’ a short quote.>
`This is another short quote.'
\end{document}