我遇到了一个问题,即 IfSubStr 列表将由逗号和空格分隔。我不希望最后的子字符串包含逗号和空格,所以我认为 StrGobbleRight(2) 是正确的方法。但是,现在我有一个不断扩大的问题。结果是“\xs_arg_i 定义中的参数编号非法。”
我想让 StrGobbleRight(2) 起作用来修剪尾随的逗号和空格,或者除此之外,让代码只在输出之间添加逗号和空格,而不是在输出之后添加逗号和空格。
代码如下:
\documentclass{article}
\usepackage{tikz} % a lot
\usetikzlibrary{math} % maths
\usepackage{xstring} % string comparisons
\begin{document}
\NewDocumentCommand{\makeDndNPCStats}{ m m m m m m m m }{
\StrGobbleRight{
\IfSubStr{#8}{str}{Str~+\pgfmathtruncatemacro\resultstr{(#1-10)/2+#7}\resultstr,~}{}
\IfSubStr{#8}{dex}{Dex~+\pgfmathtruncatemacro\resultdex{(#2-10)/2+#7}\resultdex,~}{}
\IfSubStr{#8}{con}{Con~+\pgfmathtruncatemacro\resultcon{(#3-10)/2+#7}\resultcon,~}{}
\IfSubStr{#8}{int}{Int~+\pgfmathtruncatemacro\resultint{(#4-10)/2+#7}\resultint,~}{}
\IfSubStr{#8}{wis}{Wis~+\pgfmathtruncatemacro\resultwis{(#5-10)/2+#7}\resultwis,~}{}
\IfSubStr{#8}{cha}{Cha~+\pgfmathtruncatemacro\resultcha{(#6-10)/2+#7}\resultcha,~}{}
}{2}
}
{
\makeDndNPCStats
{11} % STR
{12} % DEX
{13} % CON
{14} % INT
{15} % WIS
{16} % CHA
{3} % Proficiency
{wis,cha} % Saves
}
\end{document}
作为示例输入,我会写,
\makeDndNPCStats{11}{12}{13}{14}{15}{16}{3}{wis cha}
我期望输出
Wis +5, Cha +6
答案1
我认为您想要这样的东西,只使用内置的乳胶函数而不使用任何外部包。
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\cs_new:Npn\rs_sep:{}
\NewDocumentCommand{\makeDndNPCStats}{ m m m m m m m m }{
\cs_set:Npn\rs_sep:{}
\clist_map_inline:nn{#8}{
\rs_sep:\cs_set:Npn\rs_sep:{,~}
\str_case:nnF {##1} {
{str}{Str~\int_eval:n{(#1-10)/2+#7}}
{dex}{Dex~\int_eval:n{(#2-10)/2+#7}}
{con}{Con~\int_eval:n{(#3-10)/2+#7}}
{int}{Int~\int_eval:n{(#4-10)/2+#7}}
{wis}{Wis~\int_eval:n{(#5-10)/2+#7}}
{cha}{Cha~\int_eval:n{(#6-10)/2+#7}}
}
{2}
}
}
\ExplSyntaxOff
\makeDndNPCStats
{17} % STR
{10} % DEX
{13} % CON
{11} % INT
{12} % WIS
{14} % CHA
{3} % Proficiency
{wis,cha} % Saves
\bigskip
\makeDndNPCStats
{11} % STR
{12} % DEX
{13} % CON
{14} % INT
{15} % WIS
{16} % CHA
{3} % Proficiency
{wis,cha} % Saves
\end{document}
答案2
我建议为您的命令使用不同的语法。由于很难记住参数的顺序,而且您确实添加了用于检查的键,因此我认为最好使用“键值”语法。这样,可以按任何顺序给出值。
需要注意的是,对\int_eval:n
除法进行舍入而不是截断,因此\int_eval:n { (<value>-10)/2+#3 }
不会给出预期的结果(就像\pgfmathtruncatemacro
这样做一样);因此\int_div_truncate:nn
必须使用。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand{\makeDndNPCStats}{ m m m }
{
\rsed_makestats:nnn {#1} {#2} {#3}
}
\seq_new:N \l__rsed_makestats_output_seq
\prop_new:N \l__rsed_makestats_values_prop
\cs_new_protected:Nn \rsed_makestats:nnn
{
\prop_set_from_keyval:Nn \l__rsed_makestats_values_prop { #1 }
\seq_clear:N \l__rsed_makestats_values_seq
\clist_map_inline:nn { #3 }
{
\seq_put_right:Ne \l__rsed_makestats_output_seq
{
\text_titlecase_first:n {##1} , \exp_not:N \nobreakspace
\int_eval:n
{
\int_div_truncate:nn {\prop_item:Nn \l__rsed_makestats_values_prop {##1}-10}{2}+#2
}
}
}
\seq_use:Nn \l__rsed_makestats_output_seq { ,~ }
}
\ExplSyntaxOff
\begin{document}
\makeDndNPCStats{
str=11,
dex=12,
con=13,
int=14,
wis=15,
cha=16
}{3}{wis,cha}
\makeDndNPCStats{
dex=12,
con=13,
int=14,
str=11,
cha=16,
wis=15,
}{3}{dex,wis,cha,str}
\end{document}