如何自动转义一系列文本,例如“逐字逐句”,但没有格式?

如何自动转义一系列文本,例如“逐字逐句”,但没有格式?

我想对一系列文本进行 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。

相关内容