以下测试文档
\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
处理类别代码是专家的领域,因此我赞成第一个解决方案!