
Las imágenes (basadas en tikz) que creo suelen ser modulares. Por lo tanto, sería ideal utilizar la misma fuente para diferentes variantes de imagen.
Idealmente, esto se basaría en standalone
, ya que esto es lo que ya estoy usando, y proporcionaría un nuevo entorno que defina bloques condicionales (he nombrado el entorno conditionally
a continuación). Esos bloques de código condicional podrían habilitarse mediante una includestandalone
opción:
main.tex
:
\documentclass{article}
\usepackage{standalone}
\usepackage{tikz}
\begin{document}
\includestandalone[enableall]{figure}
\includestandalone[enable=detour]{figure}
\includestandalone[enable={detour,longer-detour}]{figure}
\end{document}
figure.tex
:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\pgfmathsetmacro{\myRadius}{2}
\coordinate (loop-start) at (-170:\myRadius);
\draw[
->,
line width=7pt,
]
(loop-start)
arc (-170:170:\myRadius)
coordinate[pos=0.75] (detour-start)
coordinate[pos=0.25] (detour-end)
coordinate[pos=0.27] (detour-end-2)
;
\begin{conditionally}{detour}
\draw[
->,
line width=3pt,
red,
] (detour-start) to[out=160, in=220, distance=6cm] (detour-end);
\end{conditionally}
\begin{conditionally}{longer-detour}
\draw[
->,
line width=3pt,
red,
] (detour-start) to[out=45, in=-30, distance=10cm] (detour-end-2);
\end{conditionally}
\end{tikzpicture}
\end{document}
¿Es posible algo como esto?
Respuesta1
Esta solución habilita la sintaxis de destino para el standalone
archivo que contiene tikzpicture
, pero utiliza un comando personalizado en el archivo principal.
Más específicamente, conditionally
es un entorno que requiere un argumento único y obligatorio.
- El argumento debe consistir en una etiqueta/etiqueta simple utilizada para identificar el contenido.
- En el ejemplo, esto se usa como parte de a
tikzpicture
, pero la solución no depende de esto. El mismo mecanismo podría usarse igualmente para incluir una selección de citas, por ejemplo, o fragmentos de código arbitrarios.
\flowconditional[<key-value list>]{<filename>}
se utiliza en el documento principal para seleccionar fragmentos por etiqueta/etiqueta de <filename>
.
- Actualmente solo hay una clave definida,
enable
. enable
toma una lista de valores separados por comas.- Cada valor debe ser una etiqueta en
<filename>
o*
, donde*
indica que se debe incluir todo el código disponible. - Sin embargo, este requisito no se aplica: si un valor pasado a
enable
no está definido enfilename
, el valor se ignorará silenciosamente.
Dado que el archivo de figura del OP se llama \jobname-fig.tex
, podemos escribir
\flowconditionalpic[enable=*]{\jobname-fig}
\flowconditionalpic[enable=detour]{\jobname-fig}
\flowconditionalpic[enable={detour,longer-detour}]{\jobname-fig}
para producir la conducta objetivo.
Se puede utilizar el mismo marco para incluir o no tabular
entornos (aunque incluir conjuntos de filas requeriría un poco más de trabajo). Por ejemplo,
\begin{table}
\caption{Tables rather than pictures}
\flowconditional[enable=tab1]{\jobname-tab}
\flowconditional[enable=tab2]{\jobname-tab}
\end{table}
\begin{table}
\caption{Order is irrelevant}
\flowconditional[enable=*]{\jobname-tab}
\flowconditional[enable={tab2,tab1}]{\jobname-tab}
\end{table}
donde \jobname-tab.tex
contiene
\documentclass{standalone}
\usepackage{array}
\usepackage{booktabs}
\begin{document}
\sffamily
\begin{conditionally}{tab1}
\begin{tabular} {ll}
\toprule
\bfseries Column 1 & \bfseries Column 2 \\
\midrule
Row 1 & Cell A \\
\bottomrule
\end{tabular}
\end{conditionally}
\begin{conditionally}{tab2}
\begin{tabular} {ll}
\toprule
\bfseries Column 1 & \bfseries Column 2 \\
\midrule
Row 1 & Cell A \\
Row 2 & Cell B \\
\bottomrule
\end{tabular}
\end{conditionally}
\end{document}
Código completo:
\begin{filecontents}[overwrite]{\jobname-fig.tex}
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\pgfmathsetmacro{\myRadius}{2}
\coordinate (loop-start) at (-170:\myRadius);
\draw[->,line width=7pt,]
(loop-start)
arc (-170:170:\myRadius)
coordinate[pos=0.75] (detour-start)
coordinate[pos=0.25] (detour-end)
coordinate[pos=0.27] (detour-end-2)
;
\begin{conditionally}{detour}
\draw[
->,
line width=3pt,
red,
] (detour-start) to[out=160, in=220, distance=6cm] (detour-end);
\end{conditionally}
\begin{conditionally}{longer-detour}
\draw[
->,
line width=3pt,
red,
] (detour-start) to[out=45, in=-30, distance=10cm] (detour-end-2);
\end{conditionally}
\end{tikzpicture}
\end{document}
\end{filecontents}
\begin{filecontents}[overwrite]{\jobname-tab.tex}
\documentclass{standalone}
\usepackage{array}
\usepackage{booktabs}
\begin{document}
\sffamily
\begin{conditionally}{tab1}
\begin{tabular} {ll}
\toprule
\bfseries Column 1 & \bfseries Column 2 \\
\midrule
Row 1 & Cell A \\
\bottomrule
\end{tabular}
\end{conditionally}
\begin{conditionally}{tab2}
\begin{tabular} {ll}
\toprule
\bfseries Column 1 & \bfseries Column 2 \\
\midrule
Row 1 & Cell A \\
Row 2 & Cell B \\
\bottomrule
\end{tabular}
\end{conditionally}
\end{document}
\end{filecontents}
\documentclass{article}
% ateb: https://tex.stackexchange.com/a/705487/ addaswyd o gwestiwn Flow: https://tex.stackexchange.com/q/705458/
\usepackage[subpreambles]{standalone}
\usepackage{tikz}
\ExplSyntaxOn
\bool_new:N \l_flow_condition_bool
\bool_set_false:N \l_flow_condition_bool
\keys_define:nn { flow }
{
enable .clist_set:N = \l_flow_conditions_clist,
enable .initial:n = ,
enable .default:n = ,
}
\NewDocumentEnvironment { conditionally } { m +b }
{
\clist_if_in:NnT \l_flow_conditions_clist { #1 }
{ \bool_set_true:N \l_flow_condition_bool }
\clist_if_in:NnT \l_flow_conditions_clist { * }
{ \bool_set_true:N \l_flow_condition_bool }
\bool_if:NT \l_flow_condition_bool { #2 }
}{ }
\NewDocumentCommand \flowconditional { O {} m }
{
\group_begin:
\keys_set:nn { flow } { #1 }
\includestandalone { #2 }
\group_end:
}
\ExplSyntaxOff
\begin{document}
\flowconditional[enable=*]{\jobname-fig}
\flowconditional[enable=detour]{\jobname-fig}
\flowconditional[enable={detour,longer-detour}]{\jobname-fig}
\begin{table}
\caption{Tables rather than pictures}
\flowconditional[enable=tab1]{\jobname-tab}
\flowconditional[enable=tab2]{\jobname-tab}
\end{table}
\begin{table}
\caption{Order is irrelevant}
\flowconditional[enable=*]{\jobname-tab}
\flowconditional[enable={tab2,tab1}]{\jobname-tab}
\end{table}
\end{document}
Editar
Lo siguiente agrega una clave adicional standalone options
. Inicialmente, esto está configurado en mode = tex
. Usar la clave sin valor vaciará las opciones. El uso de la clave con un valor establecerá las opciones en ese valor. En el siguiente ejemplo, el valor inicial se aplica a la mayoría de los casos y angle=90
se utiliza para demostrar el efecto de cambiar la opción.
\documentclass{article}
% ateb: https://tex.stackexchange.com/a/705487/ addaswyd o gwestiwn Flow: https://tex.stackexchange.com/q/705458/
\usepackage[subpreambles]{standalone}
\usepackage{tikz}
\ExplSyntaxOn
\bool_new:N \l_flow_condition_bool
\bool_set_false:N \l_flow_condition_bool
\keys_define:nn { flow }
{
enable .clist_set:N = \l_flow_conditions_clist,
enable .initial:n = ,
enable .default:n = ,
standalone ~ options .tl_set:N = \l_flow_standalone_tl,
standalone ~ options .default:n = ,
standalone ~ options .initial:n = {mode = tex},
}
\NewDocumentEnvironment { conditionally } { m +b }
{
\clist_if_in:NnT \l_flow_conditions_clist { #1 }
{ \bool_set_true:N \l_flow_condition_bool }
\clist_if_in:NnT \l_flow_conditions_clist { * }
{ \bool_set_true:N \l_flow_condition_bool }
\bool_if:NT \l_flow_condition_bool { #2 }
}{ }
\NewDocumentCommand \flowconditional { O {} m }
{
\group_begin:
\keys_set:nn { flow } { #1 }
\flow_includestandalone:Vn \l_flow_standalone_tl { #2 }
\group_end:
}
\cs_new_protected:Nn \flow_includestandalone:nn
{
\includestandalone [ #1 ] { #2 }
}
\cs_generate_variant:Nn \flow_includestandalone:nn { Vn }
\ExplSyntaxOff
\begin{document}
\flowconditional[enable=*]{\jobname-fig}
\flowconditional[enable=detour,standalone options={angle=90}]{\jobname-fig}
\flowconditional[enable={detour,longer-detour}]{\jobname-fig}
\begin{table}
\caption{Tables rather than pictures}
\flowconditional[enable=tab1]{\jobname-tab}
\flowconditional[enable=tab2]{\jobname-tab}
\end{table}
\begin{table}
\caption{Order is irrelevant}
\flowconditional[enable=*]{\jobname-tab}
\flowconditional[enable={tab2,tab1}]{\jobname-tab}
\end{table}
\end{document}
Respuesta2
Podrías usar un \pic
:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\tikzset{
pics/conditional loop/.style={
code={
\tikzset{conditional loop/.cd, #1}
\coordinate
(-loop-start)
at (-170:{\pgfkeysvalueof{/tikz/conditional loop/radius}})
;
\draw[
->,
line width=7pt,
]
(-loop-start)
arc[
start angle=-170,
end angle=170,
radius={\pgfkeysvalueof{/tikz/conditional loop/radius}}
]
coordinate[pos=0.75] (-detour-start)
coordinate[pos=0.25] (-detour-end-short)
coordinate[pos=0.27] (-detour-end-long)
;
\foreach \o/\i/\d/\e in \conditionallooploopsettings {
\draw[
->,
line width=3pt,
red,
]
(-detour-start)
to[out=\o, in=\i, distance=\d]
(-\e)
;
}
}
},
conditional loop/radius/.initial={2},
conditional loop/loop settings/.store in=\conditionallooploopsettings,
conditional loop/loop settings={},
conditional loop/all/.style={
loop settings={160/220/6cm/detour-end-short,45/-30/10cm/detour-end-long}
},
conditional loop/detour/.style={
loop settings={160/220/6cm/detour-end-short}
},
conditional loop/longer detour/.style={
loop settings={45/-30/10cm/detour-end-long}
}
}
\begin{tikzpicture}
\pic at (0,0) {conditional loop};
\pic at (0,-10) {conditional loop={all}};
\pic at (0,-20) {conditional loop={detour}};
\pic at (0,-30) {conditional loop={longer detour}};
\pic at (0,-40) {conditional loop={radius=1cm, all}};
\end{tikzpicture}
\end{document}
Una variación que también permite conditional loop={detour, longer detour}
:
\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\tikzset{
pics/conditional loop/.style={
code={
\tikzset{conditional loop/.cd, #1}
\coordinate
(-loop-start)
at (-170:{\pgfkeysvalueof{/tikz/conditional loop/radius}})
;
\draw[
->,
line width=7pt,
]
(-loop-start)
arc[
start angle=-170,
end angle=170,
radius={\pgfkeysvalueof{/tikz/conditional loop/radius}}
]
coordinate[pos=0.75] (-detour-start)
coordinate[pos=0.25] (-detour-end-short)
coordinate[pos=0.27] (-detour-end-long)
;
\pgfkeys{/tikz/conditional loop/draw loops}
}
},
conditional loop/detour arrow/.style={
->,
line width=3pt,
red,
},
conditional loop/radius/.initial={2},
conditional loop/loop settings/.store in=\conditionallooploopsettings,
conditional loop/draw loops/.initial={},
conditional loop/detour/.style={
draw loops/.append code={
\draw[conditional loop/detour arrow]
(-detour-start)
to[out=160, in=220, distance=6cm]
(-detour-end-short);
}
},
conditional loop/longer detour/.style={
draw loops/.append code={
\draw[conditional loop/detour arrow]
(-detour-start)
to[out=34, in=-30, distance=10cm]
(-detour-end-long);
}
},
conditional loop/all/.style={
detour,
longer detour
}
}
\begin{tikzpicture}
\pic at (0,0) {conditional loop};
\pic at (0,-10) {conditional loop={all}};
\pic at (0,-20) {conditional loop={detour}};
\pic at (0,-30) {conditional loop={longer detour}};
\pic at (0,-40) {conditional loop={detour, longer detour}};
\end{tikzpicture}
\end{document}