我正在与聪明人在德语文档中,我在某些情况下需要 给出的单词的属格\cref{}
。问题是,德语属格并不是对所有单词都一样,所以我需要某种类型的 switch-case。因此,我想要一个命令\crefgen{}
,其工作方式类似于\cref{}
,但返回属格。我认为我的代码很好地展示了我想要实现的目标。很抱歉,这个例子是德语的,但我没有在合理的时间内找到一个有用的英语例子。尽管如此,我强调了我想添加的重要部分,所以即使不懂德语,它也会很清楚。
\documentclass[ngerman,11pt,a4paper]{scrreprt}
\usepackage{cleveref}
\usepackage{ulem}
\newtheorem{problem}{Problem}
\newtheorem{satz}[problem]{Satz}
\newtheorem{proposition}[problem]{Proposition}
\crefname{problem}{Problem}{Probleme}
\crefname{satz}{Satz}{S{\"a}tze}
\crefname{proposition}{Proposition}{Propositionen}
\newcommand{\crefgen}[1]{
\def\tempStyle{\namecref{#1}}
\def\tempProblem{Problem}
\def\tempSatz{Satz}
\ifx\tempStyle\tempProblem{
\namecref{#1}s \labelcref{#1} % genitive for Problem
}\else{
\ifx\tempStyle\tempSatz{
\namecref{#1}es \labelcref{#1} % genitive for Satz
}\else{
No genitiv defined % error if no genitive defined
}\fi
}\fi
}
\begin{document}
\begin{problem}\label{prob}
Some Text
\end{problem}
\begin{satz}\label{sat}
Some Text
\end{satz}
\begin{proposition}\label{propo}
Some Text
\end{proposition}
\paragraph{What i want:}
Die L{\"o}sung des Problem\uline{s} \ref{prob}.\\
Die Aussage des Satz\uline{es} \ref{sat}.\\
\uline{No genitiv defined} f{\"u}r Propositionen.
\paragraph{How i want to achieve that:}
Die L{\"o}sung des \verb!\crefgen{prob}!.\\
Die Aussage des \verb!\crefgen{sat}!.\\
\verb!\crefgen{propo}! f{\"u}r Propositionen.
\paragraph{How my command looks like:}
Die L{\"o}sung des \crefgen{prob}.\\
Die Aussage des \crefgen{sat}.\\
\crefgen{propo} f{\"u}r Propositionen.
\end{document}
答案1
欢迎来到 TeX.SE!
您可以使用、一些cleveref
和一小段代码来执行以下方便的 switch-case 语句 ( )。如果请求了动名词形式但尚未定义,您将收到一条您不会错过的真正错误消息,这要归功于。当然,可以像您的示例一样插入后备字符串,但我相信这里更好。\cref@gettype
\csname
\edef
expl3
\str_case:onF
\errmessage
\errmessage
\documentclass[ngerman]{scrreprt}
\usepackage{babel}
% Without amsthm, your 'satz' and 'proposition' are considered to be of type
% 'problem'... which is indeed a problem!
\usepackage{amsthm}
\usepackage{cleveref}
\usepackage{ulem}
\usepackage{expl3}
\newtheorem{problem}{Problem}
\newtheorem{satz}[problem]{Satz}
\newtheorem{proposition}[problem]{Proposition}
\crefname{problem}{Problem}{Probleme}
\crefname{satz}{Satz}{S{\"a}tze}
\crefname{proposition}{Proposition}{Propositionen}
\makeatletter
% Let's borrow \str_case:onF from expl3 (\cs_set_eq:NN is \let)
\ExplSyntaxOn
\cs_set_eq:NN \mycref@str@oswitch \str_case:onF
\ExplSyntaxOff
\newcommand*{\crefgen}[1]{%
\cref@gettype{#1}{\mycref@type}% type: problem, satz, proposition...
\edef\mycref@name{%
\unexpanded\expandafter\expandafter\expandafter{%
\csname cref@\mycref@type @name\endcsname}}%
%
\mycref@str@oswitch
{\mycref@name}%
{%
{Problem}{Problems}%
{Satz}{Satzes}%
}%
{\errmessage{Gerund form undefined for '\mycref@name'}}%
~\labelcref{#1}%
}
\makeatother
\begin{document}
\begin{problem}\label{prob}
Some Text
\end{problem}
\begin{satz}\label{sat}
Some Text
\end{satz}
\begin{proposition}\label{propo}
Some Text
\end{proposition}
\paragraph{What I want:}
Die L{\"o}sung des Problem\uline{s} \ref{prob}.\\
Die Aussage des Satz\uline{es} \ref{sat}.\\
\uline{No genitiv defined} f{\"u}r Propositionen (or rather, throw an error).
\paragraph{How I want to achieve that:}
Die L{\"o}sung des \verb!\crefgen{prob}!.\\
Die Aussage des \verb!\crefgen{sat}!.\\
\verb!\crefgen{propo}! f{\"u}r Propositionen.
\paragraph{How my command looks like:}
Die L{\"o}sung des \crefgen{prob}.\\
Die Aussage des \crefgen{sat}.\\
An error is thrown with \verb!\errmessage! if one uncomments
\verb!\crefgen{propo}!.
%\crefgen{propo} f{\"u}r Propositionen.
\end{document}