在用户定义命令的参数中使用特殊字符

在用户定义命令的参数中使用特殊字符

我的问题与上一个问题关于处理参数中的特殊字符。但是,我无法根据自己的需要调整那里描述的技术。

数学家协会

\documentclass[fontsize=11pt, paper=a4, DIV=9]{scrartcl}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\usepackage{lmodern}
\usepackage{amssymb}
\usepackage{relsize}
\usepackage{xparse}

\makeatletter

\newcommand{\IT@Def@Hash}{\begingroup\catcode`\#=12 \gdef\IT@Char@Hash{#}\endgroup}
\newcommand{\IT@Def@Tilde}{\begingroup\catcode`\~=12 \gdef\IT@Char@Tilde{~}\endgroup}

\NewDocumentCommand{\Char}{>{\TrimSpaces}m}%
{%
  \def\IT@Char{#1}
  \ifx\IT@Char\empty
    \mbox{$\varepsilon$}%
  \else
    \IT@Def@Hash
    \ifx\IT@Char\IT@Char@Hash
      \mbox{\texttt{\#}}%
    \else
      \IT@Def@Tilde
      \ifx\IT@Char\IT@Char@Tilde
        \mbox{\textscale{.87}{$\Box$}}%
      \else
        \mbox{\texttt{\IT@Char}}%
      \fi
    \fi
  \fi
}

\makeatother

\begin{document}

\Char{}
\Char{~}
\Char{#}
\Char{x}

\end{document}

产生精确的输出

期望输出

我正在寻找。不幸的是,LaTeX 发出了五个错误。

在 的参数中“误用”特殊字符~和会非常方便。另一方面,这实际上并不是必要的,如果它造成太多麻烦,我会避免这样做。#\Char{}

答案1

你可以用 来做到这一点\str_case:。要处理~,你需要确保 TeX 在定义时可以看到它\Char(否则你会得到一个空格);至于 ,#你需要将它翻倍,因为你在另一个命令中。

\ExplSyntaxOn

\NewDocumentCommand \Char { >{\TrimSpaces} m }
{
  \str_case_x:nnF { \tl_to_str:n { #1 } }
   {
    {    } { \ensuremath{\varepsilon} }
    { ## } { \texttt{\#} }
    { \c_tilde_str  } { \textscale{.87}{$\Box$} }
   }
   { \texttt{#1} }
}

\ExplSyntaxOff

这意味着您可以轻松地为特定情况定义任何预定义输出,然后定义一个通用的 False 输出(可能还有另一个 True,但我省略了那个)。

相关内容