这个问题与执行由两个 \clist 或 \seq 中的配对元素生成的命令列表。
我正在尝试执行以下形式的命令序列
\def\alpha {^^^^03b1}
用。我更愿意以 而不是\seq_\map_pairwise_function:ccN
的形式传递参数,我想我已经弄清楚了如何做到这一点。此代码似乎运行正常。"03B1
^^^^03b1
\documentclass{article}
\usepackage{fontspec}
\usepackage{nopageno}
\newfontfamily\mathematica{Mathematica}[%
NFSSFamily=mathematica,Scale=MatchUppercase,%
Extension=.ttf,%
UprightFont=*,%
BoldFont=*-Bold]
\DeclareSymbolFont{wm}{TU}{mathematica}{m}{n}
\DeclareSymbolFont{wmb}{TU}{mathematica}{b}{n}
\ExplSyntaxOn
\Umathcode"03B1 = 0 \symwm "003B1
\Umathcode"03B2 = 0 \symwm "003B2
\NewDocumentCommand{\mapcommandfunction}{mm}{\cs_set:cpn {#1} {\codepoint_generate:nn{#2}{11}}}
\mapcommandfunction{alphatwo}{"03B1}
\mapcommandfunction{beta}{"03B2}
\ExplSyntaxOff
\begin{document}
$$\alphatwo\beta$$
\end{document}
\ExplSyntaxOn
(替换您选择的字体)。但如果我将和之间的代码替换\ExplSyntaxOff
为
\Umathcode"03B1 = 0 \symwm "003B1
\Umathcode"03B2 = 0 \symwm "003B2
\NewDocumentCommand{\mapcommands}{mm}
{
\seq_set_from_clist:cc {cmds}{#1}
\seq_set_from_clist:cc {chars}{#2}
\seq_map_pairwise_function:ccN{cmds}{chars}{\mapcommandfunction}
}
\NewDocumentCommand{\mapcommandfunction}{mm}{\cs_set:cpn {#1} {\codepoint_generate:nn{#2}{11}}}
\mapcommands{alphatwo,beta}{"03B1,"03B2}
我得到了标题中显示的错误。我不知道我做错了什么,也不知道如何发现它。更具体地说,我得到了
! Missing \endcsname inserted.
<to be read again>
\alphatwo,beta
l.27 \mapcommands{alphatwo,beta}{"03B1,"03B2}
The control sequence marked <to be read again> should
not appear between \csname and \endcsname.
我该如何解决?
答案1
您需要观察参数规范来控制扩展。
第一个版本可以工作,但是定义了
> \alphatwo=\long macro:
->\codepoint_generate:nn {"03B1}{11}.
l.22 \show\alphatwo
因此每次使用时都会进行代码点查找。
如果您使用\cs_set:cpx
查找只会发生一次:
> \alphatwo=\long macro:
->α.
l.22 \show\alphatwo
我个人会一直\cs_set:Npx
使用语法
\mapcommandfunction\alphatwo{"03B1}
因为我认为在这里使用名称而不是直接使用令牌没有任何优势。
\documentclass{article}
\usepackage{fontspec}
\usepackage{nopageno}
\newfontfamily\mathematica[NFSSFamily=mathematica]{STIX Two Math}%
\DeclareSymbolFont{wm}{TU}{mathematica}{m}{n}
\DeclareSymbolFont{wmb}{TU}{mathematica}{b}{n}
\ExplSyntaxOn
\Umathcode"03B1 = 0 \symwm "003B1
\Umathcode"03B2 = 0 \symwm "003B2
\NewDocumentCommand{\mapcommandfunction}{mm}{\cs_set:Npx #1 {\codepoint_generate:nn{#2}{11}}}
\mapcommandfunction\alphatwo{"03B1}
\mapcommandfunction\beta{"03B2}
\ExplSyntaxOff
\show\alphatwo
\begin{document}
$$\alphatwo\beta$$
\end{document}
第二个版本也类似
\seq_map_pairwise_function:ccN
anN
应该是一个单一的标记,所以\mapcommandfunction
不是{\mapcommandfunction}
,尽管 expl3 名称会更加符合惯用语。
\seq_set_from_clist:cc
第二个c
从整体中创建一个 csname,#1
因此它永远不会被用作列表。
\documentclass{article}
\usepackage{fontspec}
\usepackage{nopageno}
\newfontfamily\mathematica[NFSSFamily=mathematica]{STIX Two Math}%
\DeclareSymbolFont{wm}{TU}{mathematica}{m}{n}
\DeclareSymbolFont{wmb}{TU}{mathematica}{b}{n}
\ExplSyntaxOn
\Umathcode"03B1 = 0 \symwm "003B1
\Umathcode"03B2 = 0 \symwm "003B2
\NewDocumentCommand{\mapcommands}{mm}
{
\seq_set_from_clist:Nn\l_cmds{#1}
\seq_set_from_clist:Nn\l_chars{#2}
\seq_map_pairwise_function:NNN\l_cmds\l_chars\mapcommandfunction
}
\NewDocumentCommand{\mapcommandfunction}{mm}{\cs_set:Npx #1 {\codepoint_generate:nn{#2}{11}}}
\mapcommands{\alphatwo,\beta}{"03B1,"03B2}
\ExplSyntaxOff
\show\alphatwo
\begin{document}
$$\alphatwo\beta$$
\end{document}
答案2
我认为,需要保持同步的两个独立规范clist
将很难维护和跟踪。相反,我建议放弃映射变体并仅使用您的\mapcommandfunction
,或使用key=value
基于输入。
alphatwo
此外,就像@DavidCarlisle一样,我看不出输入而不是 的优势\alphatwo
。
最后要注意的是:不要$$
在 LaTeX 中使用 显示数学运算,而是使用\[
和\]
,或equation
环境,或amsmath
环境。$$
可能会导致间距不一致,并且不受 LaTeX 的支持。
\documentclass{article}
\usepackage{fontspec}
\usepackage{nopageno}
\newfontfamily\mathematica{Mathematica}[%
NFSSFamily=mathematica,Scale=MatchUppercase,%
Extension=.ttf,%
UprightFont=*,%
BoldFont=*-Bold]
\DeclareSymbolFont{wm}{TU}{mathematica}{m}{n}
\DeclareSymbolFont{wmb}{TU}{mathematica}{b}{n}
\ExplSyntaxOn
\Umathcode"03B1 = 0 \symwm "003B1
\Umathcode"03B2 = 0 \symwm "003B2
\NewDocumentCommand{\mapcommandfunction}{mm}{\cs_set:Npn #1 {\codepoint_generate:nn{#2}{11}}}
\msg_new:nnn { mike-pugh } { missing-value } { Missing~ value~ for~ `#1'. }
\NewDocumentCommand \mapcommands { m }
{
\keyval_parse:nnn
{ \msg_error:nnn { mike-pugh } { missing-value } }
{ \mapcommandfunction }
{#1}
}
\mapcommands{\alphatwo="03B1, \beta="03B2}
\ExplSyntaxOff
\begin{document}
\[\alphatwo\beta\]
\end{document}