我想对一系列文本进行 TeX 代码转义;这是为提供稍微整洁的 URL 格式的宏。我现在的代码是,
\newcommand{\serifurl}[2]{\textsf{\href{#1://#2}{#2}}}
其中第一个参数是协议 (http),第二个参数是链接的其余部分。虽然为 PDF 正确生成了链接,但波浪符号未转义(它们会变成空格),导致打印版本不正确。我想要\verb
没有格式的东西。
答案1
虽然我和 Joseph 一样,通常会选择更直接的路径\url
,但我可以看到这种方法无法解决您提出的问题。在这种情况下,如果您真的想按照您提议的方式排版您的 URL,那么以下代码应该可以帮助您:
\documentclass{article}
\usepackage{hyperref}
\usepackage{xstring}
\newcommand*\safetilde[1]{%
\begingroup%
\catcode`\~11%
\StrSubstitute{#1}{~}{\raise-0.85ex\hbox{\~{}}}%
% -OR- LOW TILDE (faked low tilde - code lifted from url.sty)
% \makeatletter
% \StrSubstitute{#1}{~}{{\raise.45ex\hbox{\m@th$\scriptstyle\sim$}}}%
% \makeatother
\endgroup%
}
\newcommand{\serifurl}[2]{%
\textsf{\href{#1://#2}{\safetilde{#2}}}%
}
\begin{document}
\serifurl{http}{www.middle-man.net/~alice/os~car/bob~}
\end{document}
解释:
\safetilde
在将其参数中的任何波浪号转换为\~{}
使用包\StrSubstitute
中的波浪号之前,在本地将波浪号设置为正常(字母)类别代码xstring
。由于这些字符往往比基线设置得略高,因此我们将它们降低一点负值\raise
。或者注释未注释的\StrSubstitute
行并取消注释以下 4 行注释。此代码使用数学\sim
符号排版任何波浪号(此代码取自 url.sty)。
答案2
我只需使用url
包裹:
\documentclass{article}
\usepackage{hyperref}
\begin{document}
\urlstyle{sf}
\url{http://www.tug/org}
\end{document}
答案3
比约瑟夫解决方案,您可以用\detokenize
它来(主要)在其他情况下实现您想要的效果。(正如 Joseph 提到的,url 包更适合您的特定情况,因为它可以合理地处理换行符。)
例如,
\newcommand\foo[1]{{\sffamily\detokenize{#1}}}
\foo{$#^_~}
您仍然需要注意%
控制序列后添加的额外空格,因此这不是一个完美的解决方案。(不过,至少它很短。)
答案4
我使用 Geoffrey 的答案创建了自己的版本,它似乎既保留了不包括“http”文本的语义,又正确转换了波浪线,并在“/”字符周围添加了一些空格,以便它们可以换行。\!
如果您希望间距不变,可以添加另外两个命令,但我认为它看起来不错(对于合理的 URL)。
\newcommand*\urltextchars[1]{%
\expandarg% expand the first argument once
\StrSubstitute{\detokenize{#1}}{/}{\! /\! }%
}
\newcommand{\serifurl}[2]{%
\textsf{\href{#1://#2}{\urltextchars{#2}}}%
}
catcode 功能在 XeTeX 中不起作用,所以现在是 noexpandarg。