StrGobbleRight 内部评估

StrGobbleRight 内部评估

我遇到了一个问题,即 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}

在此处输入图片描述

相关内容