在 fontspec 宏中使用 \ifstrequal

在 fontspec 宏中使用 \ifstrequal

这是我的最小失败示例:

\documentclass{article}
\usepackage{fontspec,etoolbox}
\setmainfont{TeX Gyre Schola}

\begin{document}

\newcommand\Stretch[1]{
  \ifstrequal{#1}{narrow}{0.6}{}
  \ifstrequal{#1}{wide}{1.5}{}
}

Normal. {\addfontfeature{FakeStretch=\Stretch{narrow}} Narrow.} Normal.
Normal. {\addfontfeature{FakeStretch=\Stretch{wide}} Wide.} Normal.

\end{document}

Missing \endcsname inserted(Xe)LaTeX因宏而失败并显示消息\ifstrequal。您能解释一下原因吗?我该如何修改\Stretch宏才能使其正常工作?

答案1

您需要一个可扩展的版本\Stretch\ifstrequal包含定义,因此\ifstrequal不可扩展。

可扩展定义的示例:

\documentclass{article}
\usepackage{fontspec,etoolbox}
\setmainfont{TeX Gyre Schola}

\begin{document}

\makeatletter
\newcommand*{\Stretch@narrow}{0.6}
\newcommand*{\Stretch@wide}{1.5}
\newcommand*{\Stretch}[1]{%
  \@ifundefined{Stretch@#1}{%
    \Stretch@UnknownArgument % throws error as undefined command
    1% error recovery
  }{%
    \@nameuse{Stretch@#1}%
  }
}
\makeatother

Normal. {\addfontfeature{FakeStretch=\Stretch{narrow}} Narrow.} Normal.

Normal. {\addfontfeature{FakeStretch=\Stretch{wide}} Wide.} Normal.

\end{document}

结果

的参数\Stretch被用来组成一个宏\Stretch@<argument>,根据 将其扩展为数字<argument>

如果参数未知,\Stretch@<argument>则未定义并表现为\relax(副作用\csname是 调用\@nameuse)。这将像以前一样触发错误。由于正常错误消息在此上下文中不起作用,因此上述版本\Stretch使用未知命令将错误原因传达给用户。作为错误恢复,返回\Stretch@UnknownArgument值。1

答案2

可能需要扩张转换为数字,因此您需要保持测试可扩展。这用于\@car丢弃除第一个字母之外的所有字母,然后根据n或进行测试w

在此处输入图片描述

\documentclass{article}
\usepackage{fontspec,etoolbox}
\setmainfont{TeX Gyre Schola}

\begin{document}

\makeatletter
\newcommand\Stretch[1]{%
\if n\@car #1.\@nil 0.6\else
\if w\@car #1.\@nil 1.5\else
1\fi\fi}

\makeatother

\typeout{[\Stretch{narrow}][\Stretch{wide}][\Stretch{ll}]}

Normal. {\addfontfeature{FakeStretch=\Stretch{narrow}} Narrow.} Normal.
Normal. {\addfontfeature{FakeStretch=\Stretch{wide}} Wide.} Normal.

\end{document}

答案3

fontspec您一起畅游 LaTeX3 的精彩世界!

\documentclass{article}
\usepackage{fontspec}
\setmainfont{TeX Gyre Schola}

\ExplSyntaxOn
\cs_new:Npn \Stretch #1
 {
  \str_case:nnn { #1 }
   {
    {narrow} {0.6}
    {wide}   {1.5}
   }
  {1} % fall back case
 }
\ExplSyntaxOff

\begin{document}

Normal. {\addfontfeature{FakeStretch=\Stretch{narrow}} Narrow.} Normal.
Normal. {\addfontfeature{FakeStretch=\Stretch{wide}} Wide.} Normal.

\end{document}

将其扩展到其他关键词非常容易。

在此处输入图片描述

相关内容