我正在用 LaTeX 编写文本文档,其中需要很多带有下划线的单词:foo_bar_1
,more_bar_2_long_expression_3
。
我知道这个underscore
包,但是由于某种原因,这个[strings]
选项对我来说不起作用(例如我得到Extra \endcsname. ...oncluding Chapter~\ref{ch:summary_outlook}
)。
所以我的想法是定义一个新的命令或环境
\newcommand{escunderscore}[1]{...}
其中基本上_
会被替换为\_
,这样我就可以\escunderscore{foo_bar_1}
在需要下划线时在文本中写入。这可能吗?我该怎么做?
答案1
你还可以做得更好:说
\usepackage[T1]{fontenc}
\catcode`\_=12
在您的序言中,您将被允许在任何地方使用下划线作为可打印字符(需要 T1 编码字体,因此是第一行)。对于下标,您可以使用\sb
。
临时转义下划线的命令可以是以下内容:
\makeatletter
\newcommand{\escapeus}{\begingroup\@makeother\_\@escapeus}
\newcommand*{\@escapeus}[1]{#1\endgroup}
\makeatother
但是,由于类别代码的变化,它将不能在任何命令的参数中使用(仍然需要 T1 编码字体)。
如果 T1 编码字体不可用,则需要更复杂的方法:
\makeatletter
\newcommand{\escapeus}{\begingroup\@activeus\@escapeus}
\newcommand*{\@escapeus}[1]{#1\endgroup}
\begingroup\lccode`\~=`\_\relax
\lowercase{\endgroup\def\@activeus{\catcode`\_=\active \let~\_}}
\makeatother
再次强调,该\escapeus
命令不能用作另一个命令的参数。如果你真的需要它,有一种方法:
\makeatletter
\DeclareRobustCommand*{\escapeus}[1]{%
\begingroup\@activeus\scantokens{#1\endinput}\endgroup}
\begingroup\lccode`\~=`\_\relax
\lowercase{\endgroup\def\@activeus{\catcode`\_=\active \let~\_}}
\makeatother
答案2
\documentclass{article}
\usepackage{url}
\DeclareUrlCommand\UScore{\urlstyle{rm}}
\begin{document}
foo \UScore{foo_bar_1} bar
\end{document}