\providelength を探しています

\providelength を探しています

に似たマクロが必要です\providecommand\providelength{\lengthName}{0.5cm}まだ存在しない場合は、新しい長さを指定する必要があります。必要な値が指定されていない場合は、マクロを使用して TikzPicture の標準値を設定したいと思います。Web で次のコードを見つけましたが、機能しません。

\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}

編集:

オプションの最初の引数として長さの値、2 番目の引数として長さレジスタ名を受け取る別のコマンドを追加しました\ProvideLength。長さレジスタがすでに存在する場合は警告も生成されます。

Simon のコマンドを に変更し\otherprovidelength、不足していた 2 番目の引数とスキップ レジスタへの割り当てを追加しました。

関連情報