在 ConTeXt 中组合字体开关

在 ConTeXt 中组合字体开关

我想要一组宏来切换 ConTeXt 中的字体选项,无论是斜体、倾斜还是粗体,并且我希望它们以直观的方式组合,类似于 LaTeX\textit\textbf

ConTeXt wiki 表示,命令\typeface\boldface和 的\swapface行为与我希望宏的行为类似。不幸的是,\boldface并不总是保留斜体或倾斜,并且没有类似的命令用于斜体和倾斜字体替代。下图来自这里,演示了上述命令针对各种当前字体替代方案的行为。

命令演示
(来源:contextgarden.net

\typeface在查看了、\boldface和的 ConTeXt 源代码后\swapface,发现这里,我尝试使用以下代码创建我想要的宏:

\unexpanded\def\normalItalic
    {\relax
        \ifx\fontalternative\s!bf \bi \else
        \ifx\fontalternative\s!bi \bi \else
        \ifx\fontalternative\s!bs \bi \else
                                  \it \fi\fi\fi}
\unexpanded\def\normalSlanted
    {\relax
        \ifx\fontalternative\s!bf \bs \else
        \ifx\fontalternative\s!bi \bs \else
        \ifx\fontalternative\s!bs \bs \else
                                  \sl \fi\fi\fi}
\unexpanded\def\normalBold
    {\relax
        \ifx\fontalternative\s!it \bi \else
        \ifx\fontalternative\s!sl \bs \else
        \ifx\fontalternative\s!bi \bi \else
        \ifx\fontalternative\s!bs \bs \else
                                  \bf \fi\fi\fi\fi}
\def\Italic#1{{\normalItalic #1}}
\def\Slanted#1{{\normalSlanted #1}}
\def\Bold#1{{\normalBold #1}}

不幸的是,根据\typeface\boldface和的行为,它们并没有像我预期的那样结合起来\swapface\Italic{Hello \Bold{World}!}产生输出你好 世界而不是预期的你好世界

什么原因导致我的代码的行为与宏\typeface\boldface和不同,\swapface从而它们不能正确组合?

答案1

正如解释的那样这里在 ConTeXt wiki 上,某些字符@!?通常不被视为命令中的字母。为了在命令中使用这些字符,必须将其括在\unprotect和 中\protect

看起来\s!bf和类似的命令被定义为宏可以返回的内容,因此在发生更改的情况下,\fontalternative最好使用它们而不是仅使用或类似的命令。由于在尝试的解决方案中需要使用像这样的宏,因此必须将其放在第一个定义之前,并且必须将其放在最后一个定义之后。如果没有,似乎被解释为,因此阶梯总是遵循路径。bf\fontalternative\s!bf\unprotect\protect\unprotect\s!bf\s! bf\ifx\else

添加\unprotect\protect后,\Italic{Hello \Bold{World}!}产生预期的输出:你好世界

相关内容