csquotes:pdflatex 与 lualatex/xelatex

csquotes:pdflatex 与 lualatex/xelatex

以下测试文档

\documentclass[english]{article}
\usepackage{babel}
\usepackage{ifxetex,ifluatex}
\ifluatex\else
  \ifxetex\else
    \usepackage[utf8]{inputenc}
  \fi
\fi
\usepackage{csquotes}
\MakeAutoQuote{»}{«}

\def\xxx{»Test automatic outer and »inner« quotes«}

\begin{document}

»Test automatic outer and »inner« quotes«

\xxx

\end{document}

使用 pdflatex 编译可获得预期结果(两行带正确引号)。使用 LuaLaTeX 或 XeLaTeX 编译时,第二行是错误的(没有引号)。有人能给我提示吗?提前致谢。

答案1

这一切都归结于标记化和生产线上发生的各种变化的事实\begin{document}

要使自动引号正常工作,csquotes需要使所有自动引号“处于活动状态”(类别代码 13),并赋予它们适当的含义。它在行内执行此操作\begin{document},以便在此之后读取的任何文本都将“按预期”工作。但是,在此之前读取的标记更为复杂,因为它们的代码在读取时会固定。因此,它\xxx 是根据“序言中当前的内容”定义的。

使用 pdfTeX,你可以加载inputenc所有代码点 >127 的激活代码在加载时。因此\xxx定义为»活动(或者更确切地说,组成此代码点的两个八位字节为活动)。因此有不用找了在代码中\begin{document},行内一切正常。但是,对于 XeTeX 和 LuaTeX,»在前导码中是一个“正常”字符(一般不需要特殊技巧就可以正常工作)。所以这里在文档开始挂钩期间发生更改,并被»激活。这意味着内部的定义\xxx不同的从文件主体的结果来看。

解决方案是

  • 仅在文档正文中设置文本或
  • 故意制造»和积极«\catcode`\»=\active\catcode`\«=\active

处理类别代码是专家的领域,因此我赞成第一个解决方案!

相关内容