我想以以下方式使用\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}