如何在写入文件之前获取使用 xstring 函数的宏的结果

如何在写入文件之前获取使用 xstring 函数的宏的结果

我遇到了需要将姓氏和首字母(根据名字和中间名的第一个字符从完整作者字符串中提取)写入外部文件的情况。我使用该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 

如何定义一个变量,临时从循环中获取当前值并将其写入文件?我对一些通用解决方案很感兴趣,因为我遇到过很多这样的情况

相关内容