我想要一组宏来切换 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}!}
产生预期的输出:你好世界!