我体验过 LaTeX 的一个非常令人沮丧的功能。
我曾经bnf.tex
能够编写 BNF 语法定义。我发现这种表示法<some text>
非常方便,因此我决定在整个文档中使用它。这可能是一个坏主意,但现在我宁愿不更改整个源代码。
这是我的宏:
{\catcode`\ =\active{\global\let =\ }}
\gdef<{\ensuremath{\langle}%
\ifmmode\catcode`\ =\active\relax\fi%
\begingroup\sf}
\gdef>{\/\endgroup\ensuremath{\rangle}%
\ifmmode\catcode`\ =10\relax\fi%
\relax}
它工作得很好,除了当参数为复杂的数学命令时。
所以
<cou cou>
$<cou cou>$
and $\sqrt{<cou cou>}$
会保留自己的内心空间,但是
$$\frac{<cou cou>}{E}$$
and $\Instr{<cou cou>}{E}$
将会失去他们的,看起来像<coucou>
。
实际上,在数学模式和普通模式下,将<
和之间的文本格式化>
为普通(\sf
)文本的任何解决方案在这里都非常有用:-)
以下是包含示例的完整文件:
\documentclass[12pt,a4paper]{article}
\usepackage[utf8x]{inputenc}
\usepackage[english]{babel}
\usepackage{amsmath}
\DeclareMathOperator{\instr}{Instr}
\newcommand{\Instr}[2]{\instr(#1,#2)}
\catcode`\>\active
\catcode`\<\active
{\catcode`\ =\active{\global\let =\ }}
\begingroup
\gdef<{\ensuremath{\langle}%
\ifmmode\catcode`\ =\active\relax\fi%
\begingroup\sf}
\gdef>{\/\endgroup\ensuremath{\rangle}%
\ifmmode\catcode`\ =10\relax\fi%
\relax}
\endgroup
\begin{document}
<cou cou>
$<cou cou>$
$$\frac{<cou cou>}{E}$$
$\Instr{<cou cou>}{E}$
\end{document}
答案1
我会将定义简化为这样:
\catcode`\<\active
\protected\def<#1>{\ensuremath{\langle\text{\normalfont\sffamily #1\/}\rangle}}
例子:
\documentclass[12pt,a4paper]{article}
\usepackage{amsmath}
\DeclareMathOperator{\instr}{Instr}
\catcode`\<\active
\protected\def<#1>{\ensuremath{\langle\text{\normalfont\sffamily#1\/}\rangle}}
\begin{document}
<cou cou>
$<cou cou>\frac{<cou cou>}{2}$
\[\frac{<cou cou>}{E}\]
$\instr(<cou cou>,E)$
\end{document}
我认为使用\Instr
隐藏语义的命令没有任何好处。切勿$$...$$
在 LaTeX 中使用。另外,请考虑诸如这样的双字母命令\sf
已经过时,不应使用:最好坚持使用 LaTeX2e 命令\sffamily
和类似的命令,这些命令更清楚地表明我们选择的字体属性;\normalfont
用于避免周围的字体影响语法对象的排版。
<
不过,我建议你不要激活
\protected\def\<#1>{\ensuremath{\langle\text{\normalfont\sffamily#1\/}\rangle}}
然后输入
\<cou cou>
答案2
一般来说,在文档中间更改 catcodes 是个坏主意,只需使用一个框切换到文本模式(如果您使用颜色,则使用额外的组)
\documentclass{article}
\usepackage[utf8x]{inputenc}
\usepackage[english]{babel}
\usepackage{amsmath}
\DeclareMathOperator{\instr}{Instr}
\newcommand{\Instr}[2]{\instr(#1,#2)}
\catcode`\>\active
\catcode`\<\active
\begingroup
\gdef<{\ensuremath{\langle}\hbox\bgroup\bgroup\sffamily}
\gdef>{\/\egroup\egroup\ensuremath{\rangle}}
\endgroup
\begin{document}
<cou cou>
$<cou cou>$
$$\frac{<cou cou>}{E}$$
$\Instr{<cou cou>}{E}$
\end{document}