比较字符串; \cref 命令的属格版本

比较字符串; \cref 命令的属格版本

我正在与聪明人在德语文档中,我在某些情况下需要 给出的单词的属格\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\edefexpl3\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}

截屏

相关内容