我有数百行代码
\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
(实际上,从我读过的内容来看,\seq
s 在这种情况下可能更通用)并重复使用它们。所以我需要编写一个命令,形式如下
\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
。