执行由两个 \clist 或 \seq 中的配对元素生成的命令列表

执行由两个 \clist 或 \seq 中的配对元素生成的命令列表

我有数百行代码

\Umathcode`a = 0 \symwmb "1D4B6

\Umathcode"03B1 = 0 \symrmtl "0000B

在后一种情况下,有一个对应项\def\alpha{^^^^03b1},位于 David Carlisle 的回答中的命令类型中\mathsf、\mathsfit、\mathbfsf 和 \mathbfsfit 中的希腊字母(不使用 unicode-math)将字符代码映射到各种字体的字符。由于我在几个这样的命令中重复使用拉丁字母和希腊字母,所以我想到应该可以从 \clist可用的 LaTeX 3 代码中创建几个全局定义的逗号分隔的 s xparse(实际上,从我读过的内容来看,\seqs 在这种情况下可能更通用)并重复使用它们。所以我需要编写一个命令,形式如下

\MapCodes{LatinLower}{\symYYYY}{1D486, 1D487, 1D488,...1D4CF}

可以从 中的每个\symXXXX命令中调用,就像 David 对我上一个问题的回答中那样,然后在调用命令的范围内执行此命令序列。这里,LatinLower是包含拉丁小写字母的列表或序列,可以全局定义,\symYYYY是用 声明的字体DeclareSymbolFont{YYYY}{TU}{<NFSS family>}{m}{n},最后一个参数是特定字体的插槽号列表,这些插槽号对应于所需的小写字符。

我非常确定这是可行的,但我是 LaTeX 3 的新手,无论如何通过示例学习最容易,所以我可以花一整天时间试图弄清楚这一点,interface3.pdf也可以只是问问题并从答案中学习。我希望我已经充分解释了我想要完成的任务。

答案1

您可以为块定义序列并使用\seq_map_pairwise_function:NNN

这里我只举一个简短的例子。使用数字代码(带有适当的前缀)。

\documentclass{article}
\usepackage{fontspec}

\newfontfamily{\StixTwoMath}{STIXTwoMath-Regular.otf}[
  NFSSFamily=stix,
  Script=Math,
  Scale=MatchLowercase
]

\DeclareSymbolFont{stix}{TU}{stix}{m}{n}

\ExplSyntaxOn

\NewDocumentCommand{\defineblock}{mm}
 {% #1 = block name, #2 = clist
  \seq_gclear_new:c { g_pugh_math_block_#1_seq }
  \seq_gset_from_clist:cn { g_pugh_math_block_#1_seq } { #2 }
 }

\NewDocumentCommand{\definecodes}{mmm}
 {% #1 = block name, #2 = math family, #3 = clist
  \__pugh_math_definecodes:nnn { #1 } { #2 } { #3 }
 }

\seq_new:N \l__pugh_math_temp_seq
\tl_new:N \l__pugh_math_family_tl

\cs_new_protected:Nn \__pugh_math_definecodes:nnn
 {
  \seq_set_from_clist:Nn \l__pugh_math_temp_seq { #3 }
  \tl_set:Nn \l__pugh_math_family_tl { #2 }
  \seq_map_pairwise_function:cNN
    { g_pugh_math_block_#1_seq } % the block
    \l__pugh_math_temp_seq % the codes
    \__pugh_math_assigncode:nn
 }

\cs_new_protected:Nn \__pugh_math_assigncode:nn
 {
  \Umathcode #1 = 0 ~ \use:c { sym \l__pugh_math_family_tl } #2 \scan_stop:
 }

\ExplSyntaxOff

\defineblock{LowerLatin}{`a,`b,`c}

\definecodes{LowerLatin}{stix}{"1D482,"1D483,"1D484}

\begin{document}

$abc+d$

\end{document}

由于我刚刚指定了 a 到 c,所以只有这些字符会收到特殊的\Umathcode

在此处输入图片描述

相关内容