在字体样式定义中重新映射单个字符

在字体样式定义中重新映射单个字符

我使用 autoinst 从 otf 创建了一个字体,用于在 TeX 中排版一些和弦符号。此字体由其创建者设计,用于将字符位置映射到某些音乐符号,例如小写拉丁字母 b 被映射到上标平符号,等等。转换效果很好,但我需要将一些字符重新映射到不同的默认输出。我的字体开关是:

\def\chordfont{\fontencoding{LY1}\fontfamily{OpusChordsStd-\OpusChordsStd@figurealign\OpusChordsStd@figurestyle}\selectfont%
  % working stuff omitted
}
\DeclareTextFontCommand{\textchord}{\chordfont}

当我打字时

1: \textchord{Ab-}\\
2: \textchord{Ab\symbol{28}}

我明白

输出1

我想要的是以默认-输出的方式重新映射字符。\symbol{28}

到目前为止我尝试过

%% first Try
\def\chordfont{% ...
  \def\@tempa{\symbol{28}}%
  \let-\@tempa%
}

%% second Try
\def\chordfont{% ...
  \catcode`-=\active\relax
  \def-\symbol{28}%
}

但是当我运行 latex 时,机器人尝试给我一个\inaccessible错误。我在 TeXLive2017 中使用 pdflatex。

抽象可以是:

\documentclass{article}

\def\myfirstcommand{%
  \catcode`-=\active
  \def-{\textsuperscript{-}}%
}

\makeatletter
\def\mysecondcommand{%
  \def\@tempa
  \let-\@tempa%
}
\makeatother

\begin{document}

A-

A\textsuperscript{-}

\myfirstcommand{A-}

\mysecondcommand{A-}

\end{document}

在这个最小的非工作示例中,\myfirstcommand引发两个异常:第一个\inaccessible错误,第二个- is an undefined control sequence错误。\mysecondcommand没有引发异常,但也没有提供所需的输出。

我该如何正确地做到这一点?

答案1

定义命令时,- 不处于活动状态。您可以这样做:

\documentclass{article}

\makeatletter
\begingroup
\catcode`-=\active  
\gdef\mysecondcommand{\begingroup\catcode`-=\active \def\@tempa{XXXX}%
  \let-\@tempa\@mysecondcommand}%
\gdef\@mysecondcommand#1{#1\endgroup}
\endgroup
\makeatother

\begin{document}

A-

A\textsuperscript{-}


\mysecondcommand{A-}

A-

\end{document}

在此处输入图片描述

但我会尝试重新编码字体。

答案2

我会避免激活字符,因为这不允许你\textchord在另一个命令的参数中使用。最好进行替换。

\documentclass{article}
\usepackage{xparse}

\makeatletter
\newcommand{\chordfont}{%
  \usefont{LY1}{OpusChordsStd-\OpusChordsStd@figurealign\OpusChordsStd@figurestyle}{m}{n}%
  % working stuff omitted
}
\makeatother

\renewcommand{\chordfont}{\usefont{U}{pzd}{m}{n}}% I don't have OpusChord

\ExplSyntaxOn
\NewDocumentCommand{\textchord}{m}
 {
  \group_begin:
  \tl_set:Nn \l_tmpa_tl { #1 }
  \tl_replace_all:Nnn \l_tmpa_tl { - } { \symbol{56} } % use 28
  % other replacements
  \chordfont
  \tl_use:N \l_tmpa_tl
  \group_end:
 }
\ExplSyntaxOff

\begin{document}

\textchord{Ab}

\textchord{Ab-}

{\chordfont Ab\symbol{56}} % check

{\chordfont Ab-} % check

\end{document}

由于我没有字体,所以我使用 Zapf Dingbats 代替。

在此处输入图片描述

相关内容