重新定义一个命令并在另一个命令中使用参数有时不起作用

重新定义一个命令并在另一个命令中使用参数有时不起作用

我尝试生成一个\law根据设置而行为不同的命令。\setlaw改变行为的方式不同。它似乎适用于前两种情况。但是,当尝试将参数括在括号中时,它会停止工作(对于最小情况):

\documentclass[parskip=full]{scrlttr2}

\usepackage[scaled]{helvet}
\renewcommand\familydefault{\sfdefault}

\usepackage{ifthen}
    
\newcommand{\Absatz}[1]{Absatz\,#1}
\newcommand{\Satz}[1]{Satz\,#1}

\newcommand{\setlaw}[1]
    {\ifthenelse{\equal{\detokenize{#1}}{\detokenize{long}}}
        {\renewcommand{\Absatz}[1]{Absatz\,\csname#1\endcsname}
         \renewcommand{\Satz}[1]{Satz\,\csname#1\endcsname}         
        }
        {\ifthenelse{\equal{\detokenize{#1}}{\detokenize{short}}}
            {\renewcommand{\Absatz}[1]{Abs.\,\csname#1\endcsname}
             \renewcommand{\Satz}[1]{S.\,\csname#1\endcsname}
            }
            {\ifthenelse{\equal{\detokenize{#1}}{\detokenize{min}}}
                {\renewcommand{\Absatz}[1]{(\csname#1\endcsname)}
                 \renewcommand{\Satz}[1]{\csname#1\endcsname}
                }
                {}
            }
        }
        
    }

\newcommand{\law}[4][BGB]{\S\,#2 \Absatz{#3} \Satz{#4} #1}

\begin{document}

    \law{123}{4}{2}
    \setlaw{short}
    \law{123}{4}{2}
    \setlaw{min}    
    \law{123}{4}{2}
    
\end{document}

结果应该是:

§ 123 未归类 4 未归类 2 BGB

§ 123 Abs. 4 S. 2 BGB

德国民法典第 123(4)2 条

答案1

  1. \csname#1\endcsname应该\csname##1\endcsname

  2. \csname...\endcsname是完全错误的,因为您想要打印法律编号,而不是使用基于它们的(未定义的)命令。

这是一个更简单的方法。

\documentclass[parskip=full]{scrlttr2}

%\usepackage[scaled]{helvet}
\usepackage{sourcesanspro}
\renewcommand\familydefault{\sfdefault}

\ExplSyntaxOn

\str_new:N \l_mrc_law_satz_str

\NewDocumentCommand{\setlaw}{m}
 {
  \str_set:Nn \l_mrc_law_satz_str { #1 }
 }

\NewDocumentCommand{\Absatz}{}
 {
  \str_case:Vn \l_mrc_law_satz_str
   {
    {long}{Absatz}
    {short}{Abs.\@}
    {min}{}
   }
 }
\NewDocumentCommand{\Satz}{}
 {
  \str_case:Vn \l_mrc_law_satz_str
   {
    {long}{Satz}
    {short}{S.\@}
    {min}{}
   }
 }

\ExplSyntaxOff

\newcommand{\law}[4][BGB]{\S\,#2 \Absatz\,#3 \Satz\,#4 #1}

\setlaw{long} % initialize

\begin{document}

Long: \law{123}{4}{2}

\setlaw{short}
Short: \law{123}{4}{2}

\setlaw{min}    
Min: \law{123}{4}{2}
    
\end{document}

在此处输入图片描述

相关内容