数据工具使用困难

数据工具使用困难

我想以以下方式使用\DTLstoreinitials包中的命令:\usepackage{datatool}

\newcommand{\extractInitials}[1]{%
\DTLstoreinitials{#1}{\userInitials}%
\DTLsubstituteall{\userInitials}{.}{}%remove points between the initials
\DTLsubstituteall{\userInitials}{ }{}%remove spaces
\userInitials%
}

如果我直接调用该命令,它就会起作用:

\extractInitials{My Name}

给出MN。但如果我使用辅助命令:\newcommand{\nom}{My Name}并尝试调用

\extractInitials{\nom}

然后编译失败并出现错误

!段落在 \@dtl@initials 完成之前结束。

我怎样才能解决这个问题?


这是一个最小的例子 1:

\documentclass[12pt]{article}
\usepackage{trackchanges}
\usepackage{datatool}

\newcommand{\extractInitials}[1]{%
%\expandafter\DTLstoreinitials\expandafter{#1}{\userInitials}%
\DTLstoreinitials{#1}{\userInitials}%
\DTLsubstituteall{\userInitials}{.}{}%remove points 
\DTLsubstituteall{\userInitials}{ }{}%remove spaces
}
\begin{document}
\extractInitials{AAA BBB}\addeditor{\userInitials}
\extractInitials{CCC DDD}\addeditor{\userInitials}
----------- \\% to see the result of the addeditor commands
\makeatletter
\TC@editorOne\\
\TC@editorTwo\\
\TC@editorThree\\
\makeatother
-----------
\end{document}

输出为 CD n/n n/n 比较:示例 2

\addeditor{AB}
\addeditor{CD}
----------- \\% to see the result of the addeditor commands
\makeatletter
\TC@editorOne\\
\TC@editorTwo\\
\TC@editorThree\\
\makeatother
-----------

输出为 AB CD n/n

答案1

你有两个选择。

第一的

\newcommand{\extractInitials}[1]{%
  \expandafter\DTLstoreinitials\expandafter{#1}{\userInitials}%
\DTLsubstituteall{\userInitials}{.}{}%remove points between the initials
\DTLsubstituteall{\userInitials}{ }{}%remove spaces
\userInitials
}

\nom如果立即扩展为名称并且不需要进一步处理,则可以使用它。

诀窍是#1在开始处理之前访问 at \DTLstoreinitials。第一个\expandafter作用于第二个,从而扩展括号后的第一个标记:在您的例子中,它可以是\nom;如果您直接给出一个名称,则什么也不会发生(但请参阅第二条注释)。

第二

\makeatletter
\newcommand{\extractInitials}[1]{%
  \begingroup\protected@edef\x{%
    \endgroup\noexpand\DTLstoreinitials{#1}{\noexpand\userInitials}}\x%
\DTLsubstituteall{\userInitials}{.}{}%remove points between the initials
\DTLsubstituteall{\userInitials}{ }{}%remove spaces
\userInitials
}
\makeatother

\nom如果的内容更复杂(比如\nom变成),则最好这样做\Prenom\space\Nom。在这里我们扩展到底部,但“健壮”的宏(例如重音字母的宏)保持不变。

注 1

如果的参数包含重音字符(即使使用了控制序列),则在此上下文中直接使用\edef必然会中断。\extractInitials

笔记2

在这两种情况下,如果首字母是重音字母,结果都是不可预测的。将其设置为以{É}lie Cartan获得正确的结果。但是,如果输入编码为 UTF-8,则在这种情况下,任何方法都无法可靠地工作(由于datatool。写总是括号内的第一个重音首字母。

注 3

如果必须将此宏输入到另一个命令,则结果将取决于此宏的作用。例如,它将与 一起工作\textbf{\extractInitials{My Name}},因为\textbf只想打印其参数。在其他情况下,必须采取不同的方法;例如,在您的测试文档中,必须采用间接路径:

\newcommand{\extractInitials}[1]{%
  \expandafter\DTLstoreinitials\expandafter{#1}{\userInitials}%
\DTLsubstituteall{\userInitials}{.}{}%remove points between the initials
\DTLsubstituteall{\userInitials}{ }{}%remove spaces
}
\newcommand{\myaddeditor}[1]{%
  \extractInitials{#1}\expandafter\addeditor\expandafter{\userInitials}}

然后说\myaddeditor{AAA BBB}

相关内容