I'm trying to put together four commands that encapsulate tikzpicture environments and the use of tikzmark, in one, all have their own keys, but, they have a lot of code in common.
The commands are as follows :
\tkm@ncbara[key=val]{mark-A}{mark-B}{text}
\tkm@ncbarb[key=val]{mark-A}{mark-B}{text}
\tkm@bracea[key=val]{mark-A}{mark-B}{text}
\tkm@braceb[key=val]{mark-A}{mark-B}{text}
and I created the tkmdraw command to work as follows:
\tkmdraw[ncbar-a, key val from ncbara]{mark-A}{mark-B}{text}
\tkmdraw[ncbar-b, key val from ncbarb]{mark-A}{mark-B}{text}
\tkmdraw[brace-a, key val from bracea]{mark-A}{mark-B}{text}
\tkmdraw[brace-a, key val from braceb]{mark-A}{mark-B}{text}
hypothetically I think adding more options to tkmdraw, but, I think I'm repeating a lot of code and for sure there is a correct way to do it, here's my question:
How can I put four (or more) commands in one command, without repeating so much code using expl3?
This is the FULL sample file (I can not reduce it):
% arara: pdflatex: {interaction: nonstopmode, draft: yes}
% arara: pdflatex: {interaction: nonstopmode}
% arara: clean: { extensions: [ aux, log, out ] }
\documentclass[10pt]{article}
\usepackage{amsmath,xparse,tikz}
\usetikzlibrary{tikzmark,arrows.meta,calc,decorations.pathreplacing}
\pagestyle{empty}
% Whidth for center node ... \TkM{name}{content}
\newlength{\MyL}
\newcommand*{\TkM}[2]{\settowidth{\MyL}{$\mathsurround0pt #2$}#2\hspace{-\MyL}\makebox[\MyL]{\pgfmark{#1}}}
\makeatletter
% active : for expl3
\def\@colon{:}
% default style for ncbar
\tikzset{tkmdraw/ncbar-a/.style={ >={Straight Barb[length=1.5pt,round]},
font=\footnotesize,color=gray,text=red,above=-3.5pt,},}
\tikzset{tkmdraw/ncbar-b/.style={ >={Straight Barb[length=1.5pt,round]},
font=\footnotesize,color=gray,text=red,below=-2.5pt,},}
% default style for brace
\tikzset{tkmdraw/brace-a/.style={ font=\footnotesize,color=gray,text=red,},}
\tikzset{tkmdraw/brace-b/.style={ font=\footnotesize,color=gray,text=red,},}
\ExplSyntaxOn
\keys_define:nn { tkmdraw/ncbar-a }
{
ncbar-a .bool_set:N = \l_tmpa_bool,
tikz .code:n = \tikzset{tkmdraw/ncbar-a/.append~style = {#1},},
tikz .initial:n = {},
tikz .value_required:n = true,
text .value_required:n = true,
font .value_required:n = true,
color .value_required:n = true,
above .value_required:n = true,
arrow .value_required:n = true,
text .meta:n = { tikz = { text = #1 }},
font .meta:n = { tikz = { font = #1 }},
color .meta:n = { tikz = { color = #1 }},
above .meta:n = { tikz = { above = #1 }},
arrows .meta:n = { tikz = { arrows = {#1} }},
vsep-A .dim_set:N = \l_ncbar_a_A_dim,
vsep-A .initial:n = 1.85ex,
vsep-B .dim_set:N = \l_ncbar_a_B_dim,
vsep-B .initial:n = 1.85ex,
height .dim_set:N = \l_ncbar_a_h_dim,
height .initial:n = 0.5em,
raise .meta:n = { vsep-A = #1 , vsep-B = #1 }
}
\NewDocumentCommand{\tkm@ncbara}{ O{} m m +m}
{
\group_begin:
\IfNoValueF {#1} { \keys_set:nn { tkmdraw/ncbar-a }{ #1 } }
\begin{tikzpicture}[overlay,remember~ picture,tkmdraw/ncbar-a]
\draw[<->]([yshift=\l_ncbar_a_A_dim]$(pic~ cs \@colon #2)$) -- ++(0,\l_ncbar_a_h_dim) -|
node[align=center,near~ start] {#4}
([yshift=\l_ncbar_a_B_dim]$(pic~ cs \@colon #3)$);
\end{tikzpicture}%
\group_end:
}
\keys_define:nn { tkmdraw/ncbar-b }
{
ncbar-b .bool_set:N = \l_tmpa_bool,
tikz .code:n = \tikzset {tkmdraw/ncbar-b/.append~style = {#1},},
tikz .initial:n = {},
tikz .value_required:n = true,
text .value_required:n = true,
font .value_required:n = true,
color .value_required:n = true,
above .value_required:n = true,
arrow .value_required:n = true,
text .meta:n = { tikz = { text = #1 }},
font .meta:n = { tikz = { font = #1 }},
color .meta:n = { tikz = { color = #1 }},
below .meta:n = { tikz = { below = #1 }},
arrows .meta:n = { tikz = { arrows = {#1} }},
vsep-A .dim_set:N = \l_ncbar_b_A_dim,
vsep-B .dim_set:N = \l_ncbar_b_B_dim,
height .dim_set:N = \l_ncbar_b_h_dim,
vsep-A .initial:n = -0.5ex,
vsep-B .initial:n = -0.5ex,
height .initial:n = -0.5em,
raise .meta:n = { vsep-A = #1 , vsep-B = #1 }
}
\NewDocumentCommand{\tkm@ncbarb}{ O{} m m +m}
{
\group_begin:
\IfNoValueF {#1} { \keys_set:nn { tkmdraw / ncbar-b }{ #1 } }
\begin{tikzpicture}[overlay,remember~ picture,tkmdraw/ncbar-b]
\draw[<->]([yshift=\l_ncbar_b_A_dim]$(pic~ cs \@colon #2)$) -- ++(0,\l_ncbar_b_h_dim) -|
node[align=center,near~ start] {#4}
([yshift=\l_ncbar_b_B_dim]$(pic~ cs \@colon #3)$);
\end{tikzpicture}%
\group_end:
}
\keys_define:nn { tkmdraw/brace-a }
{
brace-a .bool_set:N = \l_tmpa_bool,
tikz .code:n = \tikzset{tkmdraw/brace-a/.append~style = {#1},},
tikz .initial:n = {},
tikz .value_required:n = true,
text .meta:n = { tikz = { text = #1 }},
font .meta:n = { tikz = { font = #1 }},
color .meta:n = { tikz = { color = #1 }},
text .value_required:n = true,
font .value_required:n = true,
color .value_required:n = true,
above .dim_set:N = \l_brace_above_dim,
above .initial:n = 2.5pt,
above .value_required:n = true,
amplitude .dim_set:N = \l_brace_a_h_dim,
amplitude .initial:n = 0.4em,
amplitude .value_required:n = true,
vsep-A .dim_set:N = \l_brace_a_A_dim,
vsep-B .dim_set:N = \l_brace_a_B_dim,
vsep-A .initial:n = 1.85ex,
vsep-B .initial:n = 1.85ex,
raise .meta:n = { vsep-A = #1 , vsep-B = #1 }
}
\NewDocumentCommand{\tkm@bracea}{ O{} m m +m}
{
\group_begin:
\IfNoValueF {#1} { \keys_set:nn { tkmdraw / brace-a }{ #1 } }
\begin{tikzpicture}[overlay,remember~ picture,tkmdraw/brace-a]
\draw [decorate,decoration={brace, amplitude=\l_brace_a_h_dim}]
([yshift=\l_brace_a_A_dim]$(pic~ cs \@colon #2)$) -- ([yshift=\l_brace_a_B_dim]$(pic~ cs \@colon #3)$)
node [align=center,midway,above = \l_brace_above_dim] {#4};
\end{tikzpicture}
\group_end:
}
\keys_define:nn { tkmdraw/brace-b }
{
brace-b .bool_set:N = \l_tmpa_bool,
tikz .code:n = \tikzset{tkmdraw/brace-b/.append~style = {#1},},
tikz .initial:n = {},
tikz .value_required:n = true,
text .meta:n = { tikz = { text = #1 }},
font .meta:n = { tikz = { font = #1 }},
color .meta:n = { tikz = { color = #1 }},
text .value_required:n = true,
font .value_required:n = true,
color .value_required:n = true,
below .dim_set:N = \l_brace_below_dim,
below .initial:n = 2.5pt,
below .value_required:n = true,
amplitude .dim_set:N = \l_brace_b_h_dim,
amplitude .initial:n = 0.4em,
amplitude .value_required:n = true,
vsep-A .dim_set:N = \l_brace_b_A_dim,
vsep-B .dim_set:N = \l_brace_b_B_dim,
vsep-A .initial:n = -1ex,
vsep-B .initial:n = -1ex,
raise .meta:n = { vsep-A = #1 , vsep-B = #1 }
}
\NewDocumentCommand{\tkm@braceb}{ O{} m m +m}
{
\group_begin:
\IfNoValueF {#1} { \keys_set:nn { tkmdraw/brace-b }{ #1 } }
\begin{tikzpicture}[overlay,remember~ picture,tkmdraw/brace-b]
\draw [decorate,decoration={brace, mirror, amplitude=\l_brace_b_h_dim}]
([yshift=\l_brace_b_A_dim]$(pic~ cs \@colon #2)$) -- ([yshift=\l_brace_b_B_dim]$(pic~ cs \@colon #3)$)
node [align=center,midway,below = \l_brace_below_dim] {#4};
\end{tikzpicture}
\group_end:
}
\keys_define:nn { tkmdraw }
{
@ncbar-a .bool_set:N = \l_ncbar_a_bool,
@ncbar-b .bool_set:N = \l_ncbar_b_bool,
@brace-a .bool_set:N = \l_brace_a_bool,
@brace-b .bool_set:N = \l_brace_b_bool,
ncbar-a .meta:n = { @ncbar-a = true, @ncbar-b = false, @brace-a = false, @brace-b = false },
ncbar-b .meta:n = { @ncbar-b = true, @ncbar-a = false, @brace-a = false, @brace-b = false },
brace-a .meta:n = { @brace-a = true, @ncbar-b = false, @ncbar-a = false, @brace-b = false },
brace-b .meta:n = { @brace-b = true, @ncbar-b = false, @ncbar-a = false, @brace-a = false },
}
\NewDocumentCommand{\tkmdraw}{o m m +m}
{
\group_begin:
\tkmdraw_test_options:n { #1 }
\IfBooleanT{ \l_ncbar_a_bool } { \tkm@ncbara[#1]{#2}{#3}{#4} }
\IfBooleanT{ \l_ncbar_b_bool } { \tkm@ncbarb[#1]{#2}{#3}{#4} }
\IfBooleanT{ \l_brace_a_bool } { \tkm@bracea[#1]{#2}{#3}{#4} }
\IfBooleanT{ \l_brace_b_bool } { \tkm@braceb[#1]{#2}{#3}{#4} }
\group_end:
}
\cs_new_protected:Npn \tkmdraw_test_options:n #1
{
\str_case:xnF { \clist_item:nn { #1 } { 1 } }
{
{ncbar-a} { \keys_set:nn { tkmdraw } { ncbar-a } \keys_set:nn { tkmdraw/ncbar-a } {#1}}
{ncbar-b} { \keys_set:nn { tkmdraw } { ncbar-b } \keys_set:nn { tkmdraw/ncbar-b } {#1}}
{brace-a} { \keys_set:nn { tkmdraw } { brace-a } \keys_set:nn { tkmdraw/brace-a } {#1}}
{brace-b} { \keys_set:nn { tkmdraw } { brace-b } \keys_set:nn { tkmdraw/brace-b } {#1}}
}
{}
}
\cs_generate_variant:Nn \str_case:nnF { x }
\ExplSyntaxOff
\makeatother
\begin{document}
Whit \verb+\tkm@ncbara+ and \verb+\tkm@ncbarb+ command ... OK :)
\[ (\TkM{a1}{2}\TkM{a2}{p}q^{2})(\TkM{a3}{3}p\TkM{a4}{q})=6p^{2}q^{3} \]
\makeatletter
\tkm@ncbara[color=green,text=red,height= 0.3em]{a1}{a3}{ncbara}
\tkm@ncbarb[color=red,text=green,height= -0.3em]{a2}{a4}{ncbarb}
\makeatother
Whit \verb+\tkm@bracea+ and \verb+\tkm@braceb+ command ... OK :)
\[ (\TkM{b1}{2}\TkM{b2}{p}q^{2})(\TkM{b3}{3}p\TkM{b4}{q})=6p^{2}q^{3} \]
\makeatletter
\tkm@bracea[color=green,text=red, amplitude= 0.3em]{b1}{b3}{bracea}
\tkm@braceb[color=red,text=green, amplitude= 0.3em]{b2}{b4}{braceb}
\makeatother
\par\vspace{0.65cm}
Whit \verb+\tkmdraw[key=val]{...}+ command ... OK :)
\par\vspace{0.65cm}
% adapted from https://tex.stackexchange.com/a/76507/7832
\begin{align*}
(3{,}14 \times \TkM{c1}{10^{-2}}) + (1\TkM{c2}{{,}}2 \times \TkM{c3}{10^{-4}})
&= (3{,}14 \times \TkM{c4}{10^{-2}}) + (0\TkM{c5}{{,}}012 \times \TkM{c6}{10^{-2}})\\[3ex]
&= (3{,}14+0{,}012) \times 10^{-2}\\
&= \TkM{c7}{3}{,}152 \times \TkM{c8}{10}^{-2}
\end{align*}
\tkmdraw[ncbar-b,color=blue,text=red,raise=-3pt]{c1}{c3}{not equal}
\tkmdraw[ncbar-b,color=red,text=blue,raise=-3pt]{c4}{c6}{equal}
\tkmdraw[ncbar-a,color=red,text=blue]{c2}{c5}{The decimal is moved to the left \\ to increase the exponent}
\tkmdraw[brace-b,color=red,text=green, amplitude= 0.3em]{c7}{c8}{$0{,}30152$}
\end{document}
An image of the result that produces:

The idea behind is to "imitate" a bit, the old code that I had using pstricks, I'm trying to move my file to something more compatible with (pdf/lua)latex.
Best regards.
