Ich wollte eine benutzerdefinierte Umgebung erstellen und stehe derzeit vor folgendem Problem:
- Ich möchte meiner Umgebung eine Option übergeben, die das Tikz-Bild skaliert, aber das erste Beispiel funktioniert nicht und gibt den folgenden Fehler zurück -> ! Fehlende Zahl, wird als Null behandelt.
- Das Zweite scheint zu funktionieren, aber ich verstehe nicht, warum das Erste nicht funktioniert, wenn es dem Zweiten ähnlich ist.
- Der Fehler wird durch folgenden Code verursacht: ->
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}
Antwort1
Das Problem ist, dass man es \ExplSyntaxOn
zu spät verwendet. Es muss in dem Moment aktiviert werden, in dem \NewDocumentEnvironment
gelesen wird, da in diesem Moment entschieden wird, wie z. B. _
verarbeitet wird. Man braucht also so etwas wie
\ExplSyntaxOn
\NewDocumentEnvironment{myenv}{o}{... no switching of \ExpSyntax ...}
\ExplSyntaxOff
Aber nun liegt auch tikzpicture
, insbesondere das Leerzeichen zwischen transform
und shape
im Rahmen dieser Syntax, und tikz wird sich beschweren, dass transformshape
(ohne Leerzeichen) nicht bekannt ist.
So etwas kann man machen.
\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}