我的目标是输入常规的 LaTeX 输入,然后重新映射字体以生成 Nemeth Braille。这个问题的一个答案LaTeX 到盲文
是下载字体http://www.searchfreefonts.com/free/braille.htm。这对我来说不起作用,因为此字体不会像 Nemeth Braille 那样(默认情况下)映射 ASCII 字符。例如,使用该字体,0 和 9 分别变成 ⠔ 和 ⠯,而不是 ⠴ 和 ⠔。
此外,无论如何,我希望能够在某些情况下将单个 ASCII 字符映射到一对盲文字符。
我尝试使用 luatex 的字体处理功能进行替换。它们似乎对上面答案中提到的字体没有任何效果,但对 DejaVu 却有效果。
以下是我尝试过的:
% -*- TeX-engine: luatex; -*-
\documentclass{article}
\usepackage[no-math]{fontspec}
\directlua{
fonts.handlers.otf.addfeature {
name = "braille",
type = "substitution",
data = {
["a"] = "⠁", ["b"] = "⠃", ["c"] = "⠉",
% etc. all the way to z
["A"] = {"⠠","⠁"}, ["B"] = {"⠠","⠃"},
["C"] = {"⠠","⠉"}, % etc. all the way to Z
}}}
\directlua{
fonts.handlers.otf.addfeature {
name = "combos",
type = "multiple",
data = {
["="] = {" ","⠨","⠅"," "},
["X"] = {"⠠","⠭"},
["Y"] = {"⠠","⠽"},
}}}
\setmainfont{DejaVu Sans}[RawFeature=+braille;+combos]
\usepackage{mathastext}
\begin{document}
abc = ABC = XY
$abc\ =\ ABC\ =\ XY$ % should be identical to previous line
\end{document}
输出:
仍然不起作用的地方:(1) type 的字体功能substitution
不允许我用两个输出字符替换一个输入字符(或者我不知道如何让它这样做)。因此,两行中的 A、B 和 C 都是不正确的。(2) type 的字体功能multiple
确实允许一个输入变成两个输出字符,但使用 mathastext 包的数学字体不会继承此功能(或者我不知道如何让它这样做)。因此,数学行中的 =、X 和 Y 是不正确的。
有人知道如何让重新映射适用于 DejaVu 或上面提到的盲文字体吗?
更新 如果我添加上面的 MWE(加上相当多的替换),我会得到这个:
And now we can conclude that
$$
\int_0^\infty e^{-x^2}\,dx = \sqrt{\pi}/2
$$
Here it is with better Nemeth
$$
\int_0^\infty\baseline e^{-x^^2}\baseline \,dx \eq \sqrt{\pi}/2
$$
这是输出
方程式的第一个版本是未经修改的 LaTeX 代码,但所有替换和命令都已翻译。我认为这是个不错的开始。
第二个要求作者进行一些更改:指示下标/上标何时结束,指示何时有双上标,我使用了等号命令(因为如上所述,我无法使组合替换起作用)。我猜想更多的 latex 代码可以自动化,需要作者进行更少的更改(尤其是使用 Luatex?)。但想象添加额外的标记以使 Nemeth 更准确仍然并不可怕。
答案1
在这里,我使用tokcycle
来解析输入并将字符(和宏\eq
)转换为盲文。然而,在执行此操作的过程中,我发现我的tokcycle
包中有一个错误,即它无法=
正确消化标记。修复程序(详见后记)也已纳入 MWE。
编辑:为了演示如何以与字符相同的方式重新映射宏,我将宏映射\eq
为具有原本是标记的所需含义。宏可以以这种方式映射,而不会破坏伪环境=
之外的原始含义。\braille
通过自动将盲文映射包装在中\textrm{}
,数学模式的问题变得毫无意义,除非在数学模式下空格被截取并转换为明确的\
间距。
这里使用 lualatex 进行编译。
\documentclass{article}
\usepackage[no-math]{fontspec}
\setmainfont{DejaVu Sans}%[RawFeature=+braille;+combos]
%\usepackage{mathastext}
\usepackage{tokcycle}
\tokcycleenvironment\braille% NEW TOKCYCLE ENVIRONMENT:
{\addcytoks[4]{\tcremap{##1}}}% HOW TO TREAT CHARACTERS
{\processtoks{##1}}% HOW TO TREAT GROUP CONTENTS
{\addcytoks[4]{\tcremap{##1}}}% HOW TO TREAT MACROS
{\addcytoks{\ }}% HOW TO TREAT SPACES
\newcommand*\tcmapto[2]{\expandafter\def\csname tcmapto\string#1\endcsname{\textrm{#2}}}
\newcommand*\tcremap[1]{\ifcsname tcmapto\string#1\endcsname
\csname tcmapto\string#1\expandafter\endcsname\else\expandafter#1\fi}
\tcmapto a{⠁} \tcmapto b{⠃} \tcmapto c{⠉}
\tcmapto A{⠠⠁} \tcmapto B{⠠⠃} \tcmapto C{⠠⠉}
\tcmapto X{⠠⠭} \tcmapto Y{⠠⠽} \tcmapto ={ ⠨⠨ }
\tcmapto\eq{ ⠨⠨ }% MACRO REMAPS DONE SIMILARLY
\def\eq{EQ}% NON-BRAILLE DEFINITION
\begin{document}
1. \braille abc = ABC = XY\endbraille
2. \braille$abc = ABC = XY$\endbraille % should be identical to previous line
3. \braille abc \eq{} ABC \eq{} XY\endbraille
4. \braille$abc \eq{} ABC \eq{} XY$\endbraille % should be identical to previous line
%\detokenize\expandafter{\the\cytoks}
$\eq$ reverts to non-braille
\end{document}