
Ich brauche ein Makro ähnlich wie \providecommand
. \providelength{\lengthName}{0.5cm}
das mir eine neue Länge geben sollte, wenn sie noch nicht vorhanden ist. Ich möchte das Makro verwenden, um Standardwerte für ein TikzPicture festzulegen, wenn keine gewünschten Werte angegeben sind. Ich habe den folgenden Code im Internet gefunden, aber er funktioniert nicht:
\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\makeatletter
\newcommand*\providelength[1]{%
\begingroup
\escapechar\m@ne
\xdef\@gtempa{\string#1}%
\endgroup
\@ifundefined{\@gtempa}%
{\newskip#1}%
{}%
}
\makeatother
\begin{document}
\providelength{\ltest}{0.1pt}
\the\ltest
\end{document}
Die Ausgabe dieses Dokuments ist
0.1pt
0.0pt
Daher scheint der Befehl überhaupt keine Wirkung zu haben. Stattdessen wird das Argument ausgedruckt. Hat jemand eine Idee, wie man das lösen kann?
Antwort1
\
Meine Lösung geht davon aus, dass am Anfang des Längenregisternamens ein Zeichen steht , auf das nicht geprüft wird tikz
etc.
\documentclass[a4paper,10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{etoolbox}%
\usepackage{ifmtarg}%
\makeatletter
\newcommand*{\otherprovidelength}[2]{%
\begingroup
\escapechar\m@ne
\xdef\@gtempa{\string#1}%
\endgroup
\@ifundefined{\@gtempa}%
{\newskip#1%
#1=#2}% Assign the 2nd argument.
{}%
}
\makeatother
\providecommand{\providelength}[2]{%
\ifdeflength{#1}{% It is already defined!
}{% Not defined, so define it!
\newlength{#1}%
}%
\setlength{#1}{#2}%
}%
\makeatletter
\providecommand{\ProvideLength}[2][]{%
% Check, if the command is already defined, if not, then define it!
\ifdeflength{#2}{% It is already defined!
\GenericWarning{}{Warning: Length #2 already defined!!!!!!!!} % Optional
}{% Not defined, so define it!
\newlength{#2}%
}%
\@ifmtarg{#1}{% is 1st argument empty -> do not set the length at all!
}{% Set the length to the value of the 1st argument.
\setlength{#2}{#1}%
}% End of \@ifmtarg
}% End of \providecommand
\makeatother
\begin{document}
\providelength{\ltest}{0.01pt}
\the\ltest \par
% Some testing
\addtolength{\ltest}{0.05pt}
\the\ltest \par
\ProvideLength[0.17pt]{\ltesttwo}
\ProvideLength{\lyetanotherlength} % initialized to 0.0pt if undefined before
\the\ltesttwo \par
\the\lyetanotherlength
\end{document}
BEARBEITEN:
Ich habe einen weiteren Befehl hinzugefügt \ProvideLength
, der den Längenwert als optionales erstes Argument und die Längenregisternamen als zweites Argument verwendet. Es wird auch eine Warnung generiert, wenn das Längenregister bereits vorhanden ist.
Ich habe Simons Kommando geändert \otherprovidelength
und das fehlende 2. Argument sowie die Zuweisung zum Skip-Register ergänzt.