Пользовательская среда с опциями для tikz

Пользовательская среда с опциями для tikz

Я хотел создать собственную среду и сейчас столкнулся со следующей проблемой:

  • Я хочу передать параметр в свою среду, который масштабирует tikzpicture, но первый пример не работает и возвращает следующую ошибку -> ! Отсутствует число, рассматривается как ноль.
  • Второй вариант, похоже, работает, но я не понимаю, почему не работает первый, если он похож на второй.
  • Ошибка вызвана следующим кодом: ->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слишком поздно. Он должен быть активирован в момент, когда \NewDocumentEnvironmentсчитывается, потому что в этот момент решается, как _будет обработан eg. Поэтому вам нужно что-то вроде

\ExplSyntaxOn
\NewDocumentEnvironment{myenv}{o}{... no switching of \ExpSyntax ...}
\ExplSyntaxOff

Но теперь также tikzpicture, в частности, пробел между transformи shapeнаходится в области действия этого синтаксиса, и tikz будет жаловаться, что 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}

Связанный контент