使用 expl3 更高效的实现

使用 expl3 更高效的实现

这是我之前关于在用户定义的命令中使用特殊字符。我已经扩展了命令\Char{}以采用固定的可选参数。\Char{}应该在文本模式和数学模式下工作。

数学家协会

\documentclass{article}

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

\ExplSyntaxOn

\NewDocumentCommand \Char { o m } 
{
  \IfNoValueTF {#1}
  {
    \str_case_x:nnF { \tl_to_str:n {#2} }
    {
      {              } { \mbox{$\varepsilon$}           }
      { ##           } { \mbox{\texttt{\#}}             }
      { \c_tilde_str } { \mbox{\textscale{.87}{$\Box$}} }
    }
    { \mbox{\texttt{#2}} }
  }
  {
    \str_case_x:nnF { \tl_to_str:n {#2} }
    {
      {              } { \makebox[#1]{$\varepsilon$}           }
      { ##           } { \makebox[#1]{\texttt{\#}}             }
      { \c_tilde_str } { \makebox[#1]{\textscale{.87}{$\Box$}} }
    }
    { \makebox[#1]{\texttt{#2}} }
  }
}

\ExplSyntaxOff

\begin{document}

\Char{}\Char{~}\Char{#}\Char{x}
$\Char{}\Char{~}\Char{#}\Char{x}$
\Char[1em]{}\Char[1em]{~}\Char[1em]{#}\Char[1em]{x}
$\Char[1em]{}\Char[1em]{~}\Char[1em]{#}\Char[1em]{x}$

\end{document}

产生所需的结果

期望结果

但是,有没有更好的方法基于 expl3 实现此功能?

答案1

你可以用它作为启动器:

\documentclass{article}

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

\ExplSyntaxOn

\NewDocumentCommand \Char { o m } 
{
    \IfNoValueTF { #1 } { \makebox } { \makebox [#1] }
    {
    \str_case_x:nnF { \tl_to_str:n {#2} }
    {
      {              } { $\varepsilon$           }
      { ##           } { \texttt{\#}             }
      { \c_tilde_str } { \textscale{.87}{$\Box$} }
    }
    { \texttt{#2} }
  }
}

\ExplSyntaxOff

\begin{document}

\Char{}\Char{~}\Char{#}\Char{x}
$\Char{}\Char{~}\Char{#}\Char{x}$
\Char[1em]{}\Char[1em]{~}\Char[1em]{#}\Char[1em]{x}
$\Char[1em]{}\Char[1em]{~}\Char[1em]{#}\Char[1em]{x}$

\end{document}

答案2

\makebox[\width]{...}利用是的稍慢版本的事实\mbox{...},我们可以避免代码重复,从而牺牲一点效率。

\documentclass{article}

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

\ExplSyntaxOn

\NewDocumentCommand \Char { O{\width} m }
 {
  \str_case_x:nnF { \tl_to_str:n {#2} }
   {
    {              } { \makebox[#1]{$\varepsilon$}           }
    { ##           } { \makebox[#1]{\texttt{\#}}             }
    { \c_tilde_str } { \makebox[#1]{\textscale{.87}{$\Box$}} }
   }
   { \makebox[#1]{\texttt{#2}} }
 }

\ExplSyntaxOff

\begin{document}

\Char{}\Char{~}\Char{#}\Char{x}
$\Char{}\Char{~}\Char{#}\Char{x}$
\Char[1em]{}\Char[1em]{~}\Char[1em]{#}\Char[1em]{x}
$\Char[1em]{}\Char[1em]{~}\Char[1em]{#}\Char[1em]{x}$

\end{document}

在此处输入图片描述

相关内容