
私が作成する (tikz ベースの) 画像は、多くの場合モジュール化されています。したがって、画像のさまざまなバリエーションに同じソースを使用するのが理想的です。
理想的には、これは をベースにしたものになりますstandalone
。これは私が既に使用しているものなので、条件付きブロックを定義する新しい環境を提供します (環境の名前はconditionally
以下で付けました)。これらの条件付きコード ブロックは、オプションで有効にできますincludestandalone
。
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}
このようなことは可能でしょうか?
答え1
standalone
このソリューションは、を含むファイルに対してターゲット構文を有効にしますtikzpicture
が、メイン ファイルではカスタム コマンドを使用します。
より具体的には、conditionally
単一の必須引数を取る環境です。
- 引数は、コンテンツを識別するために使用される単純なタグ/ラベルで構成する必要があります。
- この例では、これは の一部として使用されています
tikzpicture
が、ソリューションはこれに依存しません。同じメカニズムを使用して、引用の選択や任意のコード スニペットを含めることもできます。
\flowconditional[<key-value list>]{<filename>}
メインドキュメントでは、タグ/ラベルでスニペットを選択するために使用されます<filename>
。
- 現在定義されているキーは 1 つだけです
enable
。 enable
カンマで区切られた値のリストを受け取ります。<filename>
各値は、またはのタグ/ラベルのいずれかである必要があります*
。 は*
、使用可能なすべてのコードが含まれる必要があることを示します。- ただし、この要件は強制されません。 に渡される値
enable
が で定義されていない場合filename
、その値は黙って無視されます。
OPの図のファイル名が だとすると\jobname-fig.tex
、次のように書くことができます。
\flowconditionalpic[enable=*]{\jobname-fig}
\flowconditionalpic[enable=detour]{\jobname-fig}
\flowconditionalpic[enable={detour,longer-detour}]{\jobname-fig}
目標とする行動を生み出す。
同じフレームワークを使用して、tabular
環境を含めるか含めないかを選択できます (ただし、行セットを含めるには、もう少し作業が必要です)。たとえば、
\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}
\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}
完全なコード:
\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}
編集
次の例では、追加のキー を追加しますstandalone options
。初期値は に設定されていますmode = tex
。値なしでキーを使用すると、オプションは空になります。値付きでキーを使用すると、オプションはその値に設定されます。以下の例では、ほとんどの場合に初期値が適用され、 はangle=90
オプションを変更した場合の効果を示すために使用されます。
\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}
答え2
次を使用できます\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}
次のことも可能にするバリエーション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}