有没有办法使用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
某些语言一样。加载此类包后,您应该会得到上述代码。