
Мне нужен макрос, похожий на \providecommand
. \providelength{\lengthName}{0.5cm}
должен дать мне новую длину, если она еще не существует. Я хотел бы использовать макрос для установки стандартных значений для TikzPicture, если желаемые значения не указаны. Я нашел следующий код в Интернете, но он не работает:
\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}
Результатом этого документа является
0.1pt
0.0pt
Таким образом, команда, похоже, не имеет никакого эффекта вообще. Вместо этого выводится аргумент. Есть ли у кого-нибудь идея, как это решить?
решение1
\
Мое решение предполагает, что в начале имени регистра длины есть символ, он не проверяется tikz
и т. д.
\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}
РЕДАКТИРОВАТЬ:
Я добавил еще одну команду \ProvideLength
, которая принимает значение длины как необязательный первый аргумент и имена регистров длины как второй аргумент. Она также выдаст предупреждение, если регистр длины уже существует.
Я изменил команду Саймона на \otherprovidelength
и добавил отсутствующий второй аргумент, а также назначение регистру пропуска.