使用带参数的命令将文字“#1”写入辅助文件

使用带参数的命令将文字“#1”写入辅助文件

我正在尝试使用一个参数的命令将内容写入辅助文件。写入的文本\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}

相关内容