以下代码给出错误
! 不能在水平模式下使用“宏参数字符 #”。 \DTLifinlist ...4->\def \@dtl@doifinlist ##1,#1,## 2\end@dtl@doifinlist {\def... l.18 }
\documentclass{article}
\usepackage{datatool}
\begin{document}
\DTLnewdb{dtOne}%
\dtlexpandnewvalue
\DTLnewrow{dtOne}%
\DTLnewdbentry{dtOne}{Place}{Marché}%
\DTLforeach*{dtOne}%
{\Place=Place}%
{%
\expandafter\DTLifinlist\expandafter{\Place}{Car,Man,Ferry}%
{\Place: Found!\\}%
{\Place: Not found!\\}%
}
\end{document}
如果我%\dtlexpandnewvalue
或者我将数据库条目更改为\DTLnewdbentry{dtOne}{Place}{Marche}%
('é' 改变于 '埃'),错误就消失了。
有没有办法使用\DTLifinlist
带\dtlexpandnewvalue
重音符号的字符?
答案1
您可以保护条目不被扩展,然后将条目作为字符串进行比较。
\documentclass{article}
\usepackage{datatool}
\newcommand{\DTLstringifinlist}[4]{%
\begingroup\edef\x{\endgroup
\noexpand\DTLifinlist{\detokenize\expandafter{#1}}{\detokenize{#2}}%
}\x{#3}{#4}%
}
\newcommand{\DTLnewdbprotectedentry}[3]{%
\DTLnewdbentry{#1}{#2}{\unexpanded{#3}}%
}
\begin{document}
\DTLnewdb{dtOne}
\dtlexpandnewvalue
\DTLnewrow{dtOne}
\DTLnewdbprotectedentry{dtOne}{Place}{Marché}
\DTLforeach*{dtOne}
{\Place=Place}%
{%
\DTLstringifinlist{\Place}{Car,Man,Ferry}%
{\Place: Found!}%
{\Place: Not found!}%
}
\DTLforeach*{dtOne}
{\Place=Place}%
{%
\DTLstringifinlist{\Place}{Car,Man,Ferry,Marché}%
{\Place: Found!}%
{\Place: Not found!}%
}
\DTLforeach{dtOne}{\Place=Place}{\Place}
\end{document}
pdflatex
与、xelatex
和配合使用lualatex
。
答案2
是的!只需使用 XeLaTeX 编译您的代码,就不会产生任何错误!
或者,如果您坚持使用 pdfLaTeX,您可以Marché
用替换March\'e
,这样就不会产生任何错误。
我将引用datatool
文档:
第 84 页:从 2.24 版本开始,预定义处理程序现在对 UTF-8 字符的支持有限。这仍处于实验阶段。
和
第 85 页:使用常规 (pdf)LaTeX(与 XeLaTeX 相反),每个 UTF-8 字符实际上被视为两个标记,分别代表 UTF-8 字符的第一个和第二个八位字节。这意味着 TeX 无法使用通常的反引号方法获取字符代码……