将宏参数字符写入文件(#)

将宏参数字符写入文件(#)

在 pdfLaTeX 处理过程中,我将一串键值对写入外部文件。有时值将包含\#,而我只希望#将写入文件。

这是我的代码,只要我只需要写入纯文本,它就可以正常工作。假设每个键都\@empty默认定义为;只有当其具有除 之外的值时,它才会写入文件\@empty

例如\def\objects{\@empty}\def\mystring{\@empty}

\newcommand{\setoptions}{%
  \global\edef\finaloption{}
  \getkeyval{objects}\getkeyval{mystring}
}
\newcommand{\getkeyval}[1]{%
  \def\tmpkey{#1}
  \edef\tmpval{\csname #1\endcsname}
  \ifx\@empty\tmpval
  \else
  \edef\finaloption{\finaloption,\tmpkey=\tmpval}
  \fi
}

然后,此行将键值对写入外部文件:

\setoptions
\immediate\write\mypgm{\finaloption}

我想我需要循环\tmpval检查\char23?这是朝着正确方向迈出的一步吗?

编辑:LaTeX 输入的一个示例:

\mytag[mystring=val, objects=App\#1 App\#2,caption={my title}]{myarg}

我解析并检索键值对,然后我想将此行写入外部文件:

mystring=val, objects=App#1 App#2

答案1

您可以简单地在本地重新定义\#,这是一个宏(控制字符具体来说,普通宏是控制词) 扩展为逐字文本#。这可以使用newverbs提供的包轻松完成\Verbdef

% Preamble
\usepackage{newverbs}

% write code
\begingroup
\Verbdef\#{#}%
\immediate\write\mypgm{\finaloption}%
\endgroup

如果没有此包,您可以按照下列方式进行操作:

% outside of any macro
% globally defines a macro \hashchar which holds a verbatim `#`
\begingroup
\catcode`\#=12
\gdef\hashchar{#}%
\endgroup

% write code
\begingroup
\let\#\hashchar
\immediate\write\mypgm{\finaloption}%
\endgroup

通常人们会使用\@hashchar(需要\makeatletter..\makeatother外部包或类文件)来减少名称冲突的风险。

(由于缺乏平均能量损失

答案2

#当类别代码为 12时,我会推迟执行宏:

\newcommand{\getkeyval}{\begingroup\catcode`#=12 \@getkeyval}
\newcommand{\@getkeyval}[1]{%
  \edef\tmpval{\csname #1\endcsname}%
  \ifx\@empty\tmpval
  \else
    \xdef\finaloption{\finaloption,#1=\tmpval}%
  \fi
  \endgroup}

你不应该写\#论点,而应该只写#。看一个“现实生活”的例子会很有用。

相关内容