将文档中的所有 ASCII 字符映射到 Nemeth 盲文

将文档中的所有 ASCII 字符映射到 Nemeth 盲文

我的目标是输入常规的 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}

输出:

MWE 的输出

仍然不起作用的地方:(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
$$

这是输出

更长的 Nemeth 代码示例

方程式的第一个版本是未经修改的 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}

在此处输入图片描述

相关内容