カスタム環境を作成したいのですが、現在次の問題に直面しています。
- tikzpicture をスケーリングするオプションを環境に渡したいのですが、最初の例は機能せず、次のエラーが返されます -> ! 数値が不足しているため、ゼロとして扱われます。
- 2 番目の方法は機能しているようですが、1 番目の方法が 2 番目の方法と似ているのに、なぜ機能しないのか理解できません。
- エラーは次のコードによって発生します: ->
scale = \scalevalue
\documentclass{article}
\usepackage{l3keys2e}
\usepackage{tikz}
\ExplSyntaxOn
\keys_define:nn{test} {
scale .tl_set:N = \l_test_scale_tl,
scale .default:n = 1,
scale .initial:n = 1
}
\ExplSyntaxOff
\NewDocumentEnvironment{myenv}{o}
{
% Options
\ExplSyntaxOn
\IfNoValueF{#1}{\keys_set:nn {test}{#1}}
\ExplSyntaxOff
\ExplSyntaxOn
\newcommand*{\scalevalue}{\the\numexpr\l_test_scale_tl\relax}
\ExplSyntaxOff
\begin{tikzpicture}[scale = \scalevalue, transform shape]
}
{
\end{tikzpicture}
}
\begin{document}
% Example 1: Error
%\begin{myenv}
%\node[draw] (a) at (0,0) {A};
%\end{myenv}
% Example 2: No error
\ExplSyntaxOn
\newcommand*{\scalevalue}{\l_test_scale_tl}
\ExplSyntaxOff
\begin{tikzpicture}[scale = \scalevalue, transform shape]
\node[draw] (a) at (0,0) {A};
\end{tikzpicture}
\end{document}
答え1
問題は、使用が遅すぎることです。が読み込まれた\ExplSyntaxOn
瞬間にアクティブ化する必要があります。なぜなら、この時点で、egがどのように処理されるかが決定されるからです。そのため、次のようなものが必要です。\NewDocumentEnvironment
_
\ExplSyntaxOn
\NewDocumentEnvironment{myenv}{o}{... no switching of \ExpSyntax ...}
\ExplSyntaxOff
しかし、今では、特にとtikzpicture
の間のスペースもこの構文の範囲内にあり、tikz は(スペースなし) が不明であるとエラーを出します。transform
shape
transformshape
このようなこともできます。
\documentclass{article}
\usepackage{l3keys2e}
\usepackage{tikz}
\ExplSyntaxOn
\keys_define:nn{test} {
scale .tl_set:N = \l_test_scale_tl,
scale .default:n = 1,
scale .initial:n = 1
}
\newcommand\preparePic[1]{%
\IfNoValueF{#1}{\keys_set:nn {test}{#1}}%
\newcommand*{\scalevalue}{\the\numexpr\l_test_scale_tl\relax}%
}
\ExplSyntaxOff
\NewDocumentEnvironment{myenv}{o}
{
\preparePic{#1}
\begin{tikzpicture}[scale = \scalevalue, transform shape]
}
{
\end{tikzpicture}
}
\begin{document}
\begin{myenv}
\node[draw] (a) at (0,0) {A};
\end{myenv}
\end{document}