\DTLifinlist 与 \dtlexpandnewvalue 和字符 'é' 一起使用时崩溃

\DTLifinlist 与 \dtlexpandnewvalue 和字符 'é' 一起使用时崩溃

以下代码给出错误

! 不能在水平模式下使用“宏参数字符 #”。 \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 无法使用通常的反引号方法获取字符代码……

相关内容