背景:
我目前正在写一份文档,我想用该包将一些句子排版成盲文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}