我尝试生成一个\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
\csname#1\endcsname
应该\csname##1\endcsname
。\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}