如何在 csquotes.cfg 中有条件地指定有效报价?

如何在 csquotes.cfg 中有条件地指定有效报价?

我如何有条件地指定一个活动引号,以便如果在和文档的序言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 代码了解甚少。

相关内容