我正在尝试使用一个参数的命令将内容写入辅助文件。写入的文本\createcommand
也是带有一个参数的另一个文本。当我使用“ #1
”时,元命令的参数会展开。没问题。问题是如何#1
引用辅助文件中创建的命令的参数来逐字写入“ ”。我尝试了\#1
、^^23 1
和\noexpand#1
,但都没有用。
这是我的简化示例。问题出在最后一个#1
。在本例中,我使用了“ \\#1
”,但这会添加一个不受欢迎的斜线。
\newcommand{\writeChapterCounter}[1]{
\immediate\write\preludeauxfile{
\noexpand\newcommand{\csname linktopage#1\endcsname}[1]{
\noexpand\hyperlink{topofpage.\noexpand\arabic{ch#1}}
{\#1 }
}
}
}
使用\writeChapterCounter{ChapToc}
它会产生:
\newcommand {\linktopageChapToc }[1]{ \hyperlink {topofpage.\arabic{chChapToc}} {\#1 } }
谢谢!
答案1
你想\string#
在\write
但引用你需要#
的定义主体中##
\string##
答案2
根本不需要写
#1
,因为新定义的宏的参数在定义文本的末尾作为的最后一个参数\hyperlink
。然后可以定义没有参数的新命令,然后直接获取输入中的参数\hyperlink
。行尾有很多(不需要的)空格。
\expandafter\noexpand
我在新命令前添加了\csname ...\endcsname
。如果新命令未定义,则不会改变行为,因为\csname
会自动为其分配 的含义\relax
,而不会进一步扩展。但如果命令已定义并且可以扩展,则扩展将写入文件中,这可能会造成混淆\newcommand
。
代码:
\newcommand{\writeChapterCounter}[1]{%
\immediate\write\preludeauxfile{%
\noexpand\newcommand{%
\expandafter\noexpand\csname linktopage#1\endcsname
}{%
\noexpand\hyperlink{topofpage.\noexpand\arabic{ch#1}}%
}%
}%
}
然后\writeChapterCounter{ChapToc}
会产生:
\newcommand {\linktocpageChapToc }{\hyperlink {topofpage.\arabic {chChapToc}}}
并将\linktocpageChapToc{foobar}
扩展至
\hyperlink {topofpage.\arabic {chChapToc}}{foobar}