So übergeben Sie Argumente an cleveref

So übergeben Sie Argumente an cleveref

Ich versuche, mein eigenes Theorempaket zu schreiben, das eine Reihe von Funktionen umschließt, um meine Standardpräambel zu ordnen. Dabei bin ich bei folgendem Problem hängen geblieben: Ich versuche, eine Funktion zu erstellen, um eine neue theoremähnliche Umgebung und die entsprechenden cleverefNamen zu definieren – beides in einer einzigen Methode durch einen einzigen Aufruf. Aus irgendeinem Grund gelingt mir das jedoch nicht.

Unten ein Minimalbeispiel mit zwei Ansätzen, ersterer ist das, was ich natürlich tun würde, bei letzterem versuche ich, die Latex3-Syntax zu verwenden, in der ich derzeit das umfassendere Paket schreibe (das heißt: Ich denke, für dieses Problem scheint das ein bisschen übertrieben, ich habe es trotzdem aufgenommen, weil es meinem tatsächlichen Anwendungsfall näher kommt).

\documentclass{article}

\usepackage{cleveref}

\begin{document}

% Version A
\NewDocumentCommand{\myfooA}{m m m m}{
    \newtheorem{#1}{#2}
    \Crefname{#1}{#3}{#4}
}

% Version B
\ExplSyntaxOn
\NewDocumentCommand{\myfooB}{m m m m}{
    \newtheorem{#1}{#2}
    \tl_set:Nn \l_crefname_tl {#1}
    \tl_set:Nn \l_name_tl {#3}
    \tl_set:Nn \l_names_tl {#4}
    \cs_set:Npn \l_mycrefname_cs ##1##2##3 {\Crefname{##1}{##2}{##3}}
    \exp_args:Nooo \l_mycrefname_cs \l_crefname_tl \l_name_tl \l_names_tl
}
\ExplSyntaxOff

% Test Version A
\myfooA{defA}{Definition}{Definition A}{Definitions A}
\begin{defA}\label{defA}
    Some Definition A
\end{defA}
\Cref{defA}


% Test Version B
\myfooB{defB}{Definition}{Definition B}{Definitions B}
\begin{defB}\label{defB}
    Some Definition B
\end{defB}
\Cref{defB}

\end{document}

In beiden Fällen erhalte ich die Fehlermeldung:

LaTeX: Cref reference format for label type `defA' undefined.

bzw. das Gleiche für \defB.

Weiß jemand von euch was hier los ist, bzw. was ich hier falsch mache?

Antwort1

Beide Befehle funktionieren, sofern sie in der Präambel des Dokuments definiert und aufgerufen werden.

\documentclass{article}
\usepackage{cleveref}
\NewDocumentCommand{\myfooA}{m m m m}{
    \newtheorem{#1}{#2}
    \Crefname{#1}{#3}{#4}
}

% Version B
\ExplSyntaxOn
\NewDocumentCommand{\myfooB}{m m m m}{
    \newtheorem{#1}{#2}
    \tl_set:Nn \l_crefname_tl {#1}
    \tl_set:Nn \l_name_tl {#3}
    \tl_set:Nn \l_names_tl {#4}
    \cs_set:Npn \l_mycrefname_cs ##1##2##3 {\Crefname{##1}{##2}{##3}}
    \exp_args:Nooo \l_mycrefname_cs \l_crefname_tl \l_name_tl \l_names_tl
}
\ExplSyntaxOff
\myfooA{defA}{Definition}{Definition A}{Definitions A}
\myfooB{defB}{Definition}{Definition B}{Definitions B}


\begin{document}
% Version A


% Test Version A

\begin{defA}\label{defA}
    Some Definition A
\end{defA}
\Cref{defA}


% Test Version B

\begin{defB}\label{defB}
    Some Definition B
\end{defB}
\Cref{defB}

\end{document}

Ausgabe des Codes

Antwort2

Der Code zum Definieren theoremähnlicher Umgebungen sollte in die Präambel gehören, da es sich um eine „globale“ Einstellung handelt.

Der expl3von Ihnen verwendete Code ist an mehreren Stellen fehlerhaft. Hier ist eine bereinigte Version.

\ExplSyntaxOn
\NewDocumentCommand{\definetheorem}{m m m m}
  {
    \newtheorem{#1}{#2}
    \uzername_crefname:nnn { #1 } { #3 } { #4 }
  }

\tl_new:N \l_uzername_crefname_tl
\tl_new:N \l_uzername_name_tl
\tl_new:N \l_uzername_names_tl

\cs_new_protected:Npn \uzername_crefname_make:nnn {} % initialize
\cs_generate_variant:Nn \uzername_crefname_make:nnn { VVV }

\cs_new_protected:Npn \uzername_crefname:nnn #1#2#3
% alternative, using signature instead of parameter text:
% \cs_new_protected:Nn \uzername_crefname:nnn 
  {
    \tl_set:Nn \l_uzername_crefname_tl {#1}
    \tl_set:Nn \l_uzername_name_tl {#2}
    \tl_set:Nn \l_uzername_names_tl {#3}
    \cs_set_protected:Npn \uzername_crefname_make:nnn ##1##2##3 {\Crefname{##1}{##2}{##3}}
    \uzername_crefname_make:VVV \l_uzername_crefname_tl \l_uzername_name_tl \l_uzername_names_tl
  }
\ExplSyntaxOff

Ich verstehe allerdings nicht, warum die Funktion jedes Mal eingestellt werden muss.

verwandte Informationen