强制 LaTeX 在数学模式下遵守空格

强制 LaTeX 在数学模式下遵守空格

我体验过 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}

相关内容