! 使用 \seq_map_pairwise_function:ccN 时缺少 \endcsname 插入错误

! 使用 \seq_map_pairwise_function:ccN 时缺少 \endcsname 插入错误

这个问题与执行由两个 \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}

相关内容