重复输入而不冻结 catcodes

重复输入而不冻结 catcodes

背景:

我目前正在写一份文档,我想用该包将一些句子排版成盲文braille和普通文本。我的第一个尝试是只说,然后用和\def\foo{This is an example sentence.}打印。然而,这没有起作用(至少没有正确起作用:盲文句子中没有换行符),因为更改了一些 catcode。\foo\expandafter\braille\expandafter{\foo}\braille

在查找了\braille

\def\braille{\begingroup\catcode`\ =12\catcode`\^^M=12\let\brl@@spc\undefined\@braille}

我能够创建以下命令:

\def\defbrailletext{%
    \begingroup\let\@braille\relax\braille%
        \@defbrailletext%
}
\def\@defbrailletext#1#2{%
        \def#1{{\raggedright\noindent\braille{#2}\par}}%
    \expandafter\endgroup\expandafter\endgroup%
    \expandafter\def\expandafter#1\expandafter{#1}%
}

有了它,我可以说出\defbrailletext\foo{This is an example sentence.}并随后使用 以盲文打印该句子\foo。但是,我无法使用通常的 catcodes 访问该句子。

理想情况下,我希望\defbrailletext创建两个宏(例如\foo\braillefoo),分别包含普通文本(带有普通 catcode)和盲文文本。在我看来,这需要我在This is an example sentence.不“冻结”其 catcode 的情况下进行复制,这意味着宏是不可能的。这可以在 TeX 中完成吗?如果可以,怎么做?


梅威瑟:

\documentclass{article}

\usepackage{braille}

\makeatletter
    \def\defbrailletext{%
        \begingroup\let\@braille\relax\braille%
            \@defbrailletext%
    }
    \def\@defbrailletext#1#2{%
            \def#1{{\raggedright\noindent\braille{#2}\par}}%
        \expandafter\endgroup\expandafter\endgroup%
        \expandafter\def\expandafter#1\expandafter{#1}%
    }
\makeatother

\begin{document}

% I can do this:
\def\foo{This is a test sentence.}
\foo

% And I can do this:
\defbrailletext\foo{This is a test sentence.}
\foo

% How can I do both at the same time?

\end{document}

答案1

很难避免冻结 catcode,但你可以用 来“解冻”它们\scantokens。最好先用盲文 catcode 阅读,否则在解冻之前可能会丢失一些空格。这可以通过

\documentclass{article}
\usepackage{braille}
\makeatletter
\def\defbrailletext#1{%
  \begingroup\let\@braille\relax\braille%
  \@defbrailletext#1%
}
\def\@defbrailletext#1#2{%
  \endgroup
  \endgroup
  \scantokens{\def#1{#2}\ignorespaces}% A \scantokens trick from David Carlisle
  \expandafter\def\csname braille\expandafter\@gobble\string#1\endcsname{{\raggedright\noindent\braille{#2}\par}}%
}
\makeatother
\begin{document}
\defbrailletext\foo{some thing}
\braillefoo
\foo
\end{document}

在此处输入图片描述

相关内容