我的情况是这样的。我在某些宏定义中有一个字符串,它将用作文件名。在创建文件之前,我想从该名称中删除所有空格。我尝试了以下类似方法。
\documentclass{article}
\usepackage{xstring}
\def\namewithspaces{A Name With Space}
\newtoks\tempstring
\def\createfilewithoutspaceinname#1{\tempstring=\expandafter{\StrDel{#1}{ }.lst}
\typeout{\the\tempstring}
\newwrite\fl
\openout\fl=\the\tempstring}
\begin{document}
\createfilewithoutspaceinname{\namewithspaces}
\end{document}
我预计文件名应该是这样的,ANameWithSpace.lst
但实际上并非如此。
从添加的命令可以看出\typeout
,的值为\tempstring
,
\let \@xs@assign \@xs@expand@and@assign \@xs@StrSubstitute@ {\namewithspaces }{ }{}.lst
看起来我错过了一些扩展。
答案1
在我看来,\tempstring
应该是一个宏,它用作的最后一个可选参数,\StrDel
并且这个宏应该被输入到\openout\tl
。
我还建议不要\newwrite
每次\createfilenamewithspaceinname
都使用(除非文件已关闭等或在组中)
\documentclass{article}
\usepackage{xstring}
\def\namewithspaces{A Name With Space}
\newwrite\fl%
\def\tempstring{}
\def\createfilewithoutspaceinname#1{%
\expandarg\StrDel{#1.lst}{ }[\tempstring]
\typeout{tempstring is \tempstring}
\immediate\openout\fl=\tempstring
}
\begin{document}
\createfilewithoutspaceinname{\namewithspaces}
\immediate\write\fl{\string Hello World}
\immediate\closeout\fl
\end{document}
答案2
xstring
命令大多不能通过扩展来工作。latex 格式包含一个可扩展的命令来删除空格。
\documentclass{article}
\def\namewithspaces{A Name With Space}
\makeatletter
\def\createfilewithoutspaceinname#1{%
\typeout{\expandafter\zap@space#1 \@empty}}
\makeatother
\begin{document}
\createfilewithoutspaceinname{\namewithspaces}
\end{document}
导致消息
ANameWithSpace
在控制台上