使用简单引号 "" 代替 \text{}

使用简单引号 "" 代替 \text{}

有没有办法使用newcommand或其他一些好的技术来改变任何发生的

"bla"

数学模式进入

\text{bla}

我之所以问这个问题是因为它很容易,并且不会打断阅读(La)TeX 代码的流程。

我想保留 Xe(La)TeX 的良好引用行为(即它可以使用常规“”而不是反引号来引用数学模式之外的某些文本)。

答案1

"我不认为以这种方式标记代码会增加其可读性。不过,您可以使用以下 TeX magic更改数学模式中的行为:

\documentclass{article}
\usepackage{amsmath}
\begingroup\lccode`~=`"
  \lowercase{\endgroup\def~}#1"{\text{#1}}
\mathcode`"="8000

\begin{document}
"Abc" $f_"abc"$
\end{document}

但是,请记住,这"不是输入双引号的“正确”方式,最好使用组合``''

如果文本编辑器插入的引号是,则以下内容应该有效:

\begingroup\lccode`~=`“
  \lowercase{\endgroup\def~}#1”{\text{#1}}
\mathcode`“="8000

但肯定不是使用 UTF-8 编码时pdflatex。XeLaTeX 和 LuaLaTeX 都可以。同样,我不推荐这种类型的标记,因为它容易出错,而且较少的比明确的标记更易读\text{...}

让我们看看它是如何工作的;诀窍

\begingroup\lccode`~=`“
  \lowercase{\endgroup\def~}#1”{\text{#1}}

非常常见(它在 TeXbook 中),以便为字符的活动版本(在本例中)赋予含义,就像\lowercase它的工作一样,并将转换后的标记列表放回到输入流中,以便 TeX 可以看到小写版本(在默认设置中~仍然处于活动状态)。因此 TeX 将吞掉~

\def“#1”{\text{#1}}

被定义为寻找以下内容并将介于两者之间的任何内容视为其参数,并将其传递给\text

我们\mathcode`“="8000告诉 (Xe)TeX在数学模式下必须转换为其活动版本。在文本模式下,的性质不会改变。

为什么第一个版本(带有")可以工作?因为"不是活动时,其类别代码仍为 12,并且定义告诉 TeX 查找后面的类别 12 "(只有在需要时才会转换为数学码,也就是说,如果 TeX 正在寻找数学码,而在收集被调用宏的参数文本时则不会这样做)。

为什么版本不能与一起使用pdflatex?因为这不是一个七位字符,所以pdftex将其视为\lccode`~=`“字符(在 中说 也是错误的pdftex,因为会保留一个杂散字符)。相反,使用 XeTeX 或 LuaTeX,在引擎启动标记化过程之前,多字节字符会转换为单个实体。

答案2

您可以通过激活"(例如~is)并将其定义为宏来实现此目的,该宏会查找另一个"作为结束标记。您需要使用 TeX\def原语而不是 LaTeX\newcommand宏:

\documentclass{article}

\usepackage{amsmath}

\catcode`\"=\active
\def"#1"{\text{#1}}

\begin{document}

"bla"

\text{bla}

$ a_{"bla"} = b_{\text{bla}} $

\end{document}

如果您想允许整个段落,请在\long前面添加\def

您必须小心那些也会重新定义的包,"就像babel某些语言一样。加载此类包后,您应该会得到上述代码。

相关内容