Benutzerdefinierte Umgebung mit Optionen für Tikz

Benutzerdefinierte Umgebung mit Optionen für Tikz

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 \ExplSyntaxOnzu spät verwendet. Es muss in dem Moment aktiviert werden, in dem \NewDocumentEnvironmentgelesen 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 transformund shapeim 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}

verwandte Informationen