这是我之前关于在用户定义的命令中使用特殊字符。我已经扩展了命令\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}