使用带双引号的 \lccode / \lowercase{...} 技巧

使用带双引号的 \lccode / \lowercase{...} 技巧

我的问题受到以下启发:这个问题其中描述了如何"#1"在数学模式中映射到\text{#1}

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

作为一项练习,我决定创建一个函数DefineMathText,将数学模式中\DefineMathText{\~}出现的所有情况转换为:~#1~\text{#1}

\documentclass{article}
\usepackage{amsmath}
\def\DefineMathText#1{
    \begingroup
    \lccode`~=`#1\lowercase{\endgroup%
      % do \def~#1~{\text{#1}}
      \def~##1~{\text{##1}}}
    % make #1 active in maths mode
    \mathcode`#1="8000
}
\begin{document}
\DefineMathText{\~}
This is a test: $a+b+c ~ test~$.
\end{document}

有用。

,当我尝试将特殊字符设为双引号 " 时,失败了:

\DefineMathText{"}
This is a test: $a+b+c " test"$.
% Runaway argument?
% test"$ \end {document}
% File ended while scanning use of ".

第二次尝试出现同样的错误:

\DefineMathText{\"}

"我认为这可能与仅匹配正确的引号有关。但是,如果我直接进行定义(前 3 行),则所有内容都可以编译并正常工作。

有什么方法可以\DefineMathText使用双引号“吗?

可能相关:我猜这与询问如何\DefineShortVerb{"}在包中执行相同的问题fancyvrb(比如说,由于某些奇怪的原因,我想映射"xxxx"\verb!xxxx!)。

PS-这个问题与功能的用处(有用|少用)无关。\text{...}输入并不难,而且在源代码中可能更清楚。

答案1

您正在使用分隔参数定义活动的";您要求的分隔符是活动的",TeX 永远找不到它,因为"在扫描时仍具有类别代码 12 $a+b+c " test"$

正确的定义是

\def\DefineMathText#1{%
  \begingroup
  \lccode`~=`#1\lowercase{\endgroup
    \def~##1}#1{\text{##1}}%
  \mathcode`#1=\string"8000
}

这样你的第二个例子就可以正常工作了。但是第一个例子不行,因为~ 激活。您对此无能为力,只能定义~在文本模式和数学模式中的行为不同。请注意,\mathcode`<char>="8000只有当<char>类别代码为 11 或 12 时才有效。您的第一个示例与 一起工作~,只是因为您重新定义活动的~,不是因为特殊的数学代码。

还要注意这个技巧惯于babel在加载某些激活的语言模块时工作"(例如germanngermanitalian),除非采取某些预防措施"在数学模式下恢复到类别代码 12。

"xxx"映射到的问题\verb!xxx!有所不同:这里的分隔符必须积极主动(同样要注意babel)。但更简单的是:

\catcode`"=\active
\def"{\verb"}

相关内容