我遇到了需要将姓氏和首字母(根据名字和中间名的第一个字符从完整作者字符串中提取)写入外部文件的情况。我使用该xstring
包分离字符串并“剪切”首字母。但是,宏的文本被写入文件,而不是“计算”首字母的结果。
这是一个高度简化的示例,它仅“计算”由空格或分隔的两个单词组成的任何字符串的首字母~
。我需要一个可以使用 UTF-8 的解决方案,因为该类将使用西里尔语,但在这里,为了简单起见,我还省略了西里尔语的设置。
我需要以某种方式在文件中获取与屏幕上相同的内容,但我对命令的扩展完全感到困惑,任何帮助和提示都值得赞赏。如果答案在这里,我深表歉意。我发现如何使用宏的结果而不是宏本身?但这是一个稍微不同的话题(或者只是我还没弄清楚如何在我的情况下应用它)。
\documentclass{article}
\usepackage{xstring,newfile}
\newoutputstream{file}
\openoutputfile{\jobname.txt}{file}
\begin{document}
\def\author{John Doe}
\def\initials#1{%
\expandarg
\StrSubstitute{#1}{~}{ }[\temp]%
\StrChar{\temp}{1}[\FirstInitial]%
\StrBehind{\temp}{ }[\second]%
\StrChar{\second}{1}[\SecondInitial]%
\FirstInitial. \SecondInitial.%
}
\author
\addtostream{file}{\author}
\initials{\author}
\addtostream{file}{\unexpanded\expandafter{\initials{\author}}}
\closeoutputstream{file}
\end{document}
我在屏幕上看到:
我现在进入外部文件
John Doe
\expandarg \StrSubstitute {\author }{~}{ }[\temp ]\StrChar {\temp }{1}[\FirstInitial ]\StrBehind {\temp }{ }[\second ]\StrChar {\second }{1}[\SecondInitial ]\FirstInitial . \SecondInitial .
PS 实际上,可能有几个对\author
宏的调用,它由以下代码在宏中实现,\saveauthorrus
该宏采用两个参数 Last Name 和其他参数,该参数采用 First Name 和 Middle Name,并根据这些参数的首字母“计算”
\newcommand{\saveauthorrus}[2][]{
....
\xdef\authorslist@ru@lfm{%
\ifx\authorslist@ru@lfm\@empty%
\unexpanded{#1~\initials{#2}}%
\else
\unexpanded\expandafter{\authorslist@ru@lfm},
\unexpanded{#1~\initials{#2}}%
\fi
}%
}
不幸的是,调用该函数\initials
导致正确的姓氏累积在中\authorslist@ru@lfm
,但名字和中间名的首字母(最后计算的)相同。
附言
我将简化(同时也使问题复杂化)。我需要循环执行上面写的任务。因此,对于代码
\documentclass{article}
\usepackage{xstring}
\gdef\tmp{}
\newcommand{\rd}[1]{\StrSubstitute{#1}{-}{}[\str]\gdef\tmp{\str}}
\begin{document}
\newwrite\txt
\immediate\openout\txt=\jobname.txt
\newcount\somecounter
\somecounter = 3
\newcount\i
\i = 0
\loop
\advance\i 1
\the\i-a-b-c -
\rd{\the\i-a-b-c}%
\tmp\par
\immediate\write\txt{\expandafter\unexpanded{\tmp}}
\ifnum \i < \somecounter
\repeat
\closeout\txt
\end{document}
这里\somecounter
有一个计数器,它已经为本文全局定义,但为了简单起见,在示例中进行了硬设置。然后我得到了屏幕上
但在文件中总是
\tmp
\tmp
\tmp
如何定义一个变量,临时从循环中获取当前值并将其写入文件?我对一些通用解决方案很感兴趣,因为我遇到过很多这样的情况