Doppelte Indizes im Makro zusammenführen

Doppelte Indizes im Makro zusammenführen

Ich möchte ein Makro definieren \des, das ein Argument hat und diesem einen Index hinzufügt, also \des{a}entsprechen sollte a_{des}. Soweit ist die Lösung offensichtlich, das Makro sollte jedoch auch Argumente akzeptieren, die bereits Tief-/Hochstellungen enthalten und die Indizes ggf. mit einem Komma zusammenführen. In der Praxis möchte ich \des{a_{foo1}^{foo2}}dasselbe Ergebnis wie erzielen a_{foo1, des}^{foo2}.

Ich bin mir bewusst, dassDasAntwort undDas, ich kann sie jedoch nicht an meinen Fall anpassen. Darüber hinaus \deskann der Befehl auch beispielsweise in Bildunterschriften erscheinen, was Probleme zu verursachen scheint, möglicherweise im Zusammenhang mit Hyperref und/oder Argumenterweiterung.

Vielen Dank für Ihre Hilfe.

Antwort1

Mit expl3

  • Wir prüfen, ob _das Argument Folgendes enthält \des:
  • wenn es kein Inneres gibt _, hängen wir einfach _{\textnormal{des}}an das Argument von an \des; und
  • wenn es tatsächlich mindestens eins gibt _, ersetzen wir es durch ein Makro ( \riccardo_dessb:n), das wiederum bei der Erweiterung ein Argument (den ursprünglichen Index) annimmt und in umwandelt _{<original subscript>,\textnormal{des}}( _{<whatever>}wird im Grunde in umgewandelt _{<whatever>,\textnormal{des}}).

Hier ist der richtige Code

\documentclass{scrartcl}

\usepackage{xparse,mathtools}

\NewDocumentCommand\des{m}{\csname riccardo_des:nn\endcsname{#1}{_}}
\ExplSyntaxOn
\cs_new_protected:Npn \riccardo_des:nn #1 #2
 {
  \tl_set:Nn \l_tmpa_tl { #1 }
  \tl_if_in:NnTF \l_tmpa_tl { #2 }
   { \tl_replace_all:Nnn \l_tmpa_tl { #2 } { \riccardo_dessb:n } }
   { \tl_put_right:Nn \l_tmpa_tl { \sb { \textnormal{des} } } }
  \tl_use:N \l_tmpa_tl
 }
\cs_new_protected:Npn \riccardo_dessb:n #1
 { \sb { #1 , \textnormal{des} } }
\ExplSyntaxOff

\begin{document}
$\des{a}$ and $\des{a_{b}^{c}}$
\end{document}

Bildbeschreibung hier eingeben

Zusatz

Wenn Sie eine klare Syntax wie \des{a}_{b}^{c}anstelle von bevorzugen \des{a_{b}^{c}}, finden Sie hier eine Lösung mitetwas CodeIch habe vor ein paar Wochen einen Beitrag gepostet. Er sieht vielleicht umständlich aus, aber die tatsächliche Definition ist viel kürzer.

\documentclass{scrartcl}

\usepackage{xparse,mathtools}

% begin addition for new arguments
\ExplSyntaxOn
\cs_new_protected:Npn \__xparse_count_type_k:w #1
 {
  \__xparse_single_token_check:n { #1 }
  \quark_if_recursion_tail_stop_do:Nn #1 { \__xparse_bad_arg_spec:wn }
  \__xparse_count_mandatory:N
 }
\cs_new_protected:Npn \__xparse_count_type_K:w #1 #2
 {
  \__xparse_single_token_check:n { #1 }
  \quark_if_recursion_tail_stop_do:nn { #2 } { \__xparse_bad_arg_spec:wn }
  \__xparse_count_mandatory:N
 }
\cs_new_protected:Npn \__xparse_add_type_k:w #1
 { \exp_args:NNo \__xparse_add_type_K:w #1 { \c__xparse_no_value_tl } }
\cs_new_protected:Npn \__xparse_add_type_K:w #1 #2
 {
  \__xparse_flush_m_args:
  \__xparse_add_grabber_optional:N K
  \tl_put_right:Nn \l__xparse_signature_tl { #1 { #2 } }
  \__xparse_prepare_signature:N
 }
\cs_new_protected:Npn \__xparse_add_expandable_type_k:w #1
 {
  \exp_args:NNo \__xparse_add_expandable_type_K:w #1 { \c__xparse_no_value_tl }
 }
\cs_new_protected_nopar:Npn \__xparse_add_expandable_type_K:w #1 #2
 {
  \__msg_kernel_error:nnx { xparse } { invalid-expandable-argument-type } { K }
  \__xparse_add_expandable_type_m:w % May be create this?
 }
\cs_new_protected:Npn \__xparse_grab_K:w #1 #2 #3 \l__xparse_args_tl
 {
  \__xparse_grab_K_aux:NnnNn #1 { #2 } { #3 } \cs_set_protected_nopar:Npn
   { _ignore_spaces }
 }
\cs_new_protected:Npn \__xparse_grab_K_long:w #1 #2 #3 \l__xparse_args_tl
 {
  \__xparse_grab_K_aux:NnnNn #1 { #2 } { #3 } \cs_set_protected:Npn
   { _ignore_spaces }
 }
\cs_new_protected:Npn \__xparse_grab_K_trailing:w #1 #2 #3 \l__xparse_args_tl
 {
  \__xparse_grab_K_aux:NnnNn #1 { #2 } { #3 } \cs_set_protected_nopar:Npn
   { _ignore_spaces }
 }
\cs_new_protected:Npn \__xparse_grab_K_long_trailing:w #1 #2 #3 \l__xparse_args_tl
 {
  \__xparse_grab_K_aux:NnnNn #1 { #2 } { #3 } \cs_set_protected:Npn
   { _ignore_spaces }
 }
\cs_new_protected:Npn \__xparse_grab_K_aux:NnnNn #1 #2 #3 #4 #5
 {
  \exp_after:wN #4 \l__xparse_fn_tl ##1
   {
    \__xparse_add_arg:n { ##1 }
    #3 \l__xparse_args_tl
   }    
  \use:c { peek_meaning_remove #5 :NTF } #1
   { \l__xparse_fn_tl }
   {
    \__xparse_add_arg:n { #2 }
    #3 \l__xparse_args_tl
   }
 }

\prop_put:Nnn \c__xparse_shorthands_prop { a } { k \sb }
\prop_put:Nnn \c__xparse_shorthands_prop { b } { k \sp }
\prop_put:Nnn \c__xparse_shorthands_prop { A } { K \sb }
\prop_put:Nnn \c__xparse_shorthands_prop { B } { K \sp }
\ExplSyntaxOff
% end

\NewDocumentCommand\des{ma}
  {#1\IfValueTF{#2}{_{#2,\textnormal{des}}}{_{\textnormal{des}}}}

\begin{document}
$\des{a}$ and $\des{a}_{b}^{c}$
\end{document}

Antwort2

Um alle Möglichkeiten zu berücksichtigen, können Sie reguläre Ausdrücke verwenden. Ich gehe nur davon aus, dass auf kein Leerzeichen folgt _, aber auch das könnte möglich sein.

Die Namen der Funktionen sollten selbsterklärend sein. Die Syntax der regulären Ausdrücke finden Sie unter texdoc l3regex.

\documentclass{article}
\usepackage{xparse,l3regex}

\ExplSyntaxOn
\NewDocumentCommand{\des}{m}
 {
  \riccardo_des:n { #1 }
 }

\tl_new:N \l_riccardo_des_arg_tl

\cs_new_protected:Nn \riccardo_des:n
 {
  \regex_match:nnTF { \_ } { #1 }
   {
    \riccardo_des_sub:n { #1 }
   }
   {
    \riccardo_des_nosub:n { #1 }
   }
 }

% syntactic sugar
\cs_new_protected:Nn \riccardo_des_replace:nnn
 {
  \tl_set:Nn \l_riccardo_des_arg_tl { #3 }
  \regex_replace_once:nnN { #1 } { #2 } \l_riccardo_des_arg_tl
  \tl_use:N \l_riccardo_des_arg_tl
 }

\cs_new_protected:Nn \riccardo_des_nosub:n
 {
  \riccardo_des_replace:nnn { ([^\^]*) } { \1\cD\_\cB\{\c{destext}\cE\} } { #1 }
 }

\cs_new_protected:Nn \riccardo_des_sub:n
 {
  \regex_match:nnTF { \_\{ } { #1 }
   {
    \riccardo_des_sub_braced:n { #1 }
   }
   {
    \riccardo_des_sub_unbraced:n { #1 }
   }
 }

\cs_new_protected:Nn \riccardo_des_sub_unbraced:n
 {
  \riccardo_des_replace:nnn { \_(.) } { \cD\_\cB\{\1,\c{destext}\cE\} } { #1 }
 }

\cs_new_protected:Nn \riccardo_des_sub_braced:n
 {
  \riccardo_des_replace:nnn { \_\{(.*?)\} } { \cD\_\cB\{\1,\c{destext}\cE\} } { #1 }
 }

\ExplSyntaxOff

\newcommand{\destext}{\mathrm{des}}

\begin{document}

$\des{a}+\des{a^{}}+\des{a^2}$

$\des{a_1}+\des{a_1^2}+\des{a^2_1}$

$\des{a_{1}}+\des{a_{1}^2}+\des{a^2_{1}}$

$\des{a_{1}}+\des{a_{1}^{2}}+\des{a^{2}_{1}}$

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen