我有如下模式
\href{https://tex.stackexchange.com/}{\verb|stackexchange.com $1|}
\verb|stackexchange.com $1|
生成的pdf是:
我想要的是stackexchange.com $1
。那我该怎么办?
转义字符\$
显然是一种解决方案,但我只想要纯文本,因此当我对这种模式使用 \newcommand 时无需添加转义字符,例如:
\newcommand{\tex}[2]{\href{https://tex.stackexchange.com/#2}{#1}}
并按以下方式使用它:
\tex{\verb|stackexchange.com $1|}{test}
答案1
可以将命令的工作实例\verb
放入第二个参数中\href
通过从 .tex-input-file 读取进入\href
第二个参数的内容,并根据 verbatim-category-code-régime 进行标记然后“输入”到\scantokens
通常的类别代码制度下,像往常一样进行重新标记。
为了在通常的类别代码制度下进行重新标记,您可能希望%
在行尾有一个,然后将其解释为注释字符,以防止\scantokens
'最后插入的行尾字符生效。
而不是像下面这样\tex
调用命令。\MyMacro
\MyMacro
依赖于在 verbatim-catcode-régime 有效时读取和标记其参数。
因此\MyMacro
- 通过从 .tex-input-file 读取并标记来获取形成这些参数的标记时。
- 当在其他时刻形成这些参数的标记在 verbatim-category-code-régime 生效期间被读取和标记化时,然后将它们传递给
\MyMacro
。
因此,\MyMacro
在许多情况下,如果构成其参数的标记是在不同于逐字分类代码制度的分类代码制度下读取和标记的,例如在通常的分类代码制度下,则无法正常工作。
例如,当从 .tex 文件读取并标记的参数时,\section{\MyMacro{\verb|stackexchange.com $1|}{test}}
由于构成 的参数的标记\MyMacro
是在通常的分类代码制度下(而不是逐字分类代码制度)标记的,因此无法正常工作。在移动参数或 pdf 字符串中 使用通常是一个大问题。 (TeX 术语中的“移动参数”是一种宏参数,它可以自动出现在文档的许多地方。例如,像和这样的分段命令的参数是移动参数,因为它们可以进入目录、交叉引用、页眉、pdf 书签…… pdf 字符串(例如 .pdf 文件内的书签文本)是 .pdf 文件本身“基础结构”的组成部分,需要以符合 pdf 标准的方式进行编码,以便可以被查看和/或以其他方式处理 .pdf 文件的程序理解。)\section
\MyMacro
\chapter
\section
\nameref
\documentclass{article}
\usepackage{hyperref}
\begingroup
\catcode`\Z=14 %
\catcode`\%=12 Z
\csname @firstofone\endcsname{Z
\endgroup
\newcommand\scantokenswithoutendline[1]{\begingroup\newlinechar=-1 \escapechar=92 \scantokens{\endgroup#1%}}Z
}%
\NewDocumentCommand{\MyMacro}{vv}{%
\href{https://tex.stackexchange.com/#2}{\scantokenswithoutendline{#1}}%
}%
\begin{document}
% This creates a link to the not-existing page
% https://tex.stackexchange.com/test .
% The phrase of the link is: \verb|stackexchange.com $1|
\MyMacro{\verb|stackexchange.com $1|}{test}
\end{document}