我如何有条件地指定一个活动引号,以便如果在和文档的序言csquotes.cfg
中将相同的字符变成活动引号,则不会产生错误?.cfg
我有以下有效代码csquotes.cfg
:
\MakeAutoQuote{‘}{’}
\MakeAutoQuote*{“}{”}
\endinput
是否可以在前导码末尾激活此代码,并且仅当\MakeAutoQuote
尚未\MakeAutoQuote*
为这些字符设置和时?
也就是说,尽管如此,我还是希望能够编译以下文档csquotes.cfg
:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{csquotes}
\MakeAutoQuote{‘}{’}
\MakeAutoQuote*{“}{”}
\begin{document}
‘abc’
\end{document}
也
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{csquotes}
\begin{document}
‘abc’
\end{document}
答案1
看到\MakeAutoQuote
或 后\MakeAutoQuote*
,以适当的方式csquotes
定义两个参数。表示字符的 UTF-8 表示形式的十进制 ASCII 码,如果是多字节,则用句点分隔。\csq@string@<number>
<number>
但是,该软件包已经提供了转换所需的基础设施。
\begin{filecontents}{csquotes.cfg}
\MakeAutoQuote{‘}{’}
\MakeAutoQuote*{“}{”}
\end{filecontents}
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{csquotes}
\makeatletter
\def\ConditionalMakeAutoQuote#1#{%
\def\cfr@star{#1}\CMAQ@
}
\def\CMAQ@#1#2{%
\csq@ifutfchar{#1}
{\csq@ifvalidutf{#1}
{\ifcsundef{csq@string@\csq@number{#1}}
{\expandafter\MakeAutoQuote\cfr@star{#1}{#2}}
{}
}%
{\csq@err@utf}}
{\csq@ifvalidchar{#1}
{\ifcsundef{csq@string@\number`#1}
{\expandafter\MakeAutoQuote\cfr@star{#1}{#2}}
{}}%
{\csq@err@char}}}
\makeatother
\ConditionalMakeAutoQuote{‘}{’}
\ConditionalMakeAutoQuote*{“}{”}
\begin{document}
‘abc’
“abc”
‘abc “abc” abc’
\end{document}
我得到了相同的结果,即
无论有没有文件csquotes.cfg
,它都是在之后读取的csquotes.def
,所以在文档中任何可能的引用字符的定义之前。
答案2
好的。由于似乎没人上钩,我做了一些调查,得出了以下结论csquotes.cfg
。
\AtEndPreamble{%
\DeleteQuotes
\MakeAutoQuote{‘}{’}%
\MakeAutoQuote*{“}{”}%
}
\endinput
但是,这意味着我无法覆盖特定文档序言中的默认值,因为它的工作方式是删除现有定义(无论它们是什么),然后添加我想要的定义作为默认值。
这是与我在问题中发布的两个 MWE 兼容,即两者都可以编译。
然而,这并不令人满意。我宁愿添加如果可能的话,到文档级定义,或者到没做什么,否则。我确实尝试检查角色的 cat 代码是否处于活动状态,但我无法让它工作,可能是因为我对管理 cat 代码了解甚少。