Editar

Editar

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 conditionallya continuación). Esos bloques de código condicional podrían habilitarse mediante una includestandaloneopció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 standalonearchivo que contiene tikzpicture, pero utiliza un comando personalizado en el archivo principal.

Más específicamente, conditionallyes 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.
  • enabletoma 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 enableno está definido en filename, 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.

salida objetivo

Se puede utilizar el mismo marco para incluir o no tabularentornos (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.texcontiene

\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}

La misma idea con tabulares en lugar de partes de una imagen tikz.

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=90se 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}

efecto de configurar `opciones independientes = {ángulo = 90}

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}

ingrese la descripción de la imagen aquí

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}

ingrese la descripción de la imagen aquí

información relacionada