简单来说,我想改变键盘按键和unicode字符的映射,但不是通过编程来实现的。我想用LaTeX来实现。
例如。根据@Ulrike 和@Phelype 的建议,我编辑了我的 MWE。
这是 Ulrike 给我提供的代码。
\documentclass{article}
\directlua
{
fonts.handlers.otf.addfeature
{
name = "shuffle",
type = "multiple",
data =
{
["अ"] = {"ə"},
["ब"] = {"b"},
["क"] = {"k"},
["ड"] = {"ɖ"},
},
}
}
\usepackage{fontspec}
\setmainfont{Doulos SIL}%
[
RawFeature=+shuffle,
]
\begin{document}
अबकड
\end{document}
注意 - 这里使用的脚本是梵文。指定的字体是 SIL 字体。这种输入将使我能够将本地正字法中收集的数据转换为语音脚本进行处理。fontspec 使用的字体是语音字母表。我使用 XeLaTeX,所以我提供的每个字符(使用适当的字体)看起来都完全一样。我不知道在 Lua 中是怎么回事。
PS - 我知道我的文本编辑器可以替换字符,但我想为整个键盘执行此操作,而不仅仅是为两个或三个字符执行此操作。因此,为每个字符执行此操作将非常繁琐。因此,更改映射可能是目前解决我的问题的最佳方法。
答案1
好的,它还没有完全准备好发布,但我将利用这个机会介绍即将推出的tokcycle
包(更新:tokcycle
软件包 V1.0 现已在 CTAN 上发布,https://www.ctan.org/pkg/tokcycle,发布于 2019/08/21)。它可以帮助您构建工具来处理来自输入流的标记。这里的想法是,如果您可以构建一个宏来处理任意单个(非宏、非空格)标记,那么tokcycle
就可以提供一个包装器,使用您提供的宏逐个标记地处理输入流。
更新:Christian Tellechea 就如何改进此软件包提供了宝贵的见解,因此我花费了更多时间来尽可能多地实现这些改进。更新:我已将 Christian 列为此软件包的贡献者。他提供了一些代码,并激励我尝试使 tokcycle 的解析阶段尽可能通用。
封装方法是将输入流中接下来的内容分类为特点,团体,宏, 或者空间在创建标记循环时,您的工作是指定如何处理这四种可能性的 LaTeX 指令。
该包提供了工具来帮助您构建这些指令,其功能是处理标记流并将处理后的标记放置在输出流中,最好将其构成为标记寄存器(由包提供\cytoks
)。
让我们来处理手头的问题。我需要构建一个可以执行单个特点标记输入并提供到不同字符(不同字体)的映射。这是我为此提出的可扩展代码:
\def\tcmapto#1#2{\expandafter\def\csname tcmapto#1\endcsname{#2}}
\def\tcremap#1{\ifcsname tcmapto#1\endcsname
\csname tcmapto#1\endcsname\else#1\fi}
\tcmapto अP
\tcmapto बQ
\tcmapto कR
\tcmapto डS
映射不必是单个标记。例如,\tcmapto ब{$\alpha$}
是有效映射。宏\tcremap
基本上说,如果我找到重映射,就使用它,否则只输出原始标记。我提供了 4 个标记的重映射,如上所示。
现在让我们开始tokcycle
语法。它提供了 Plain-TeX 支持的tokcycle.tex
宏语法 ( )\tokcycle
和\expandedtokcycle
伪环境\tokencycle...\endtokencycle
。
该expanded
版本适用\expanded
于处理之前的输入流tokcycle
(可以使用 隔离宏\noexpand
)。
此外,它支持xpress
这些宏/环境的版本,以便重复调用可以使用最近指定的指令,而不必每次都重新输入指令。
最后,提供了方法来\tokcycleenvironment<\environmentname>{}{}{}{}
创建一个更加永久的环境并将其指令锁定到位。
对于这个 MWE(使用 LuaLaTeX),我们将使用
\tokencycle
{<Character directive>}
{<Group directive>}
{<Macro directive>}
{<Space directive>}%
<token input stream>
\endtokencycle
现在来看看代码。首先,代码是为了解决 OP 的问题。它在 Character 指令中以\expanded
宏 的形式使用了新的 TeX 原语\addcytoks[x]{\tcremap{#1}}
,它将在将结果附加到\cytoks
令牌寄存器之前完全展开重映射。如果您的引擎仍然不支持\expanded
,您可以在这种情况下将该宏替换为\edef\tmp{\tcremap{#1}}\addcytoks[1]{\tmp}
。
其他指令只是包的默认值:组内容按每个标记重新提交到标记循环(\processtoks
),宏按字面意思回显到输出流中(\addcytoks
),空格也是如此。
\documentclass{article}
\usepackage{tokcycle}
\def\tcmapto#1#2{\expandafter\def\csname tcmapto#1\endcsname{#2}}
\def\tcremap#1{\ifcsname tcmapto#1\endcsname
\csname tcmapto#1\endcsname\else#1\fi}
\tcmapto अP
\tcmapto बQ
\tcmapto कR
\tcmapto डS
\begin{document}
%अबकड
\verb|\tcremap| handles a single token: \tcremap{अ}.
\verb|\tokencycle| and \verb|\tokcycle| handle a stream of
such tokens, including embedded macros.
\noindent\hrulefill
PSEUDO ENVIRONMENT
\tokencycle
{\addcytoks[x]{\tcremap{#1}}}
{\processtoks{#1}}
{\addcytoks{#1}}
{\addcytoks{#1}}
अबकड डड \textit{बकअ} कड.
Other text for which no mapping is yet given as of \today.
अबक done.
\endtokencycle
\end{document}
答案2
使用 lualatex:
\documentclass{article}
\directlua
{
fonts.handlers.otf.addfeature
{
name = "shuffle",
type = "multiple",
data =
{
["a"] = {"p"},
["b"] = {"r"},
["c"] = {"s"},
["d"] = {"t"},
},
}
}
\usepackage{fontspec}
\setmainfont{texgyreheros}%
[
RawFeature=+shuffle,
]
\begin{document}
abcd
\end{document}
答案3
真的吗,真的馊主意 :-)
您可以激活要重新映射的字符,然后重新定义它们以打印其他字符。但是,如果您激活a
,则\newcommand
(例如)将不再起作用,因为 TeX 会将其理解为\newcomm and
,其中a
被替换为p
。
我定义了一个命令\remap
,它接受字符并使第一个字符打印第二个字符,另一个\remapchars
命令应包含\remap
指令,然后使用新设置排版参数,然后将其还原以避免出现问题。不要使用\remap
“on the loose”。你已被警告。下面是:
\documentclass{article}
\newcommand\remap[2]{%
\catcode`#1=\active
\begingroup
\lccode`~=`#1%
\lowercase{\endgroup\def~{\char`#2}}\ignorespaces}
\newcommand\remapchars{%
\begingroup
\remap ap
\remap bq
\remap cr
\remap ds
\innerremap}
\newcommand\innerremap[1]{#1\endgroup}
\begin{document}
`abcd'\remapchars{`abcd'}`abcd'
\end{document}