这是我的最小失败示例:
\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}
将其扩展到其他关键词非常容易。