Quería crear un entorno personalizado y actualmente me enfrento al siguiente problema:
- Quiero pasar una opción a mi entorno que escale tikzpicture pero el primer ejemplo no funciona y devuelve el siguiente error ->! Número faltante, tratado como cero.
- El segundo parece funcionar pero no entiendo por qué el primero no si es similar al segundo.
- El error es causado por el siguiente código: ->
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}
Respuesta1
El problema es que lo consumes \ExplSyntaxOn
demasiado tarde. Tiene que activarse en el momento en que \NewDocumentEnvironment
se lee, porque en ese momento se decide cómo, por ejemplo, _
se procesará. Entonces necesitas algo como
\ExplSyntaxOn
\NewDocumentEnvironment{myenv}{o}{... no switching of \ExpSyntax ...}
\ExplSyntaxOff
Pero ahora también tikzpicture
, en particular el espacio entre transform
y shape
está dentro del alcance de esta sintaxis, y tikz se quejará de que transformshape
(sin espacio) no se conoce.
Puedes hacer algo como esto.
\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}