![将宏参数字符写入文件(#)](https://linux22.com/image/243551/%E5%B0%86%E5%AE%8F%E5%8F%82%E6%95%B0%E5%AD%97%E7%AC%A6%E5%86%99%E5%85%A5%E6%96%87%E4%BB%B6%EF%BC%88%23%EF%BC%89.png)
在 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}
你不应该写\#
论点,而应该只写#
。看一个“现实生活”的例子会很有用。