定义“转义下划线”环境

定义“转义下划线”环境

我正在用 LaTeX 编写文本文档,其中需要很多带有下划线的单词:foo_bar_1more_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}

相关内容