Anschlussfrage zu: https://tex.stackexchange.com/questions/491625/amsmath-how-can-i-use-the-equation-numbering-and-label-manually-and-anywhere
Anschlussfrage zu: https://texwelt.de/wissen/fragen/24809/befehl-mit-mehreren-optionalen-argumenten
Auch hier gefragt: https://tex.stackexchange.com/questions/491646/amsmath-how-to-make-inline-tags-with-and-without-labels


alt text

Ich will einen Befehl \tagx erstellen, der in der normalen Verwendung die nächste folgende Gleichungsnummer erzeugt, z.B. (1.2) (und zwar inline, d.h. an beliebigem Ort, z.B. in einem array).

  • Allerdings soll der Befehl die optionale Möglichkeit haben, ein Label zu setzen
    \tagx[label=eq:foo] .... \eqref{eq:foo}
  • oder auch die optionale Möglichkeit, für einen eigenen Namen (z.B. (***) statt (1.2))
    \tagx[name=***]
  • oder eben beides \tagx[name=***, label=eq:foo]

Aber das Anwenden von pgfkeys in dem Befehl von @egreg (hier label-Angabe Pflichtargument!)

Öffne in Overleaf
\usepackage{xparse}
% \tagx[shown text, optional]{label-name}
\makeatletter
\NewDocumentCommand{\tagx}{om}{%
  \IfNoValueTF{#1}
   {% normal equation number
    \refstepcounter{equation}(\theequation)\label{#2}%
   }
   {% personal tag
    (#1)\def\@currentlabel{#1}\label{#2}%
   }%
}
\makeatother

doch schwieriger als ich dachte.

Was muss ich tun?

Unvollständiges MWE:
(mit LaTeX Warning: Label multiply defined)

Öffne in Overleaf
\documentclass[12pt]{scrreprt}
\usepackage{amsmath, amsfonts, amssymb}

% Ein pgfkey
    \pgfkeys{/tagx/.cd,
label/.initial={\def\@currentlabel{#1}\label{#2}},
name/.initial={}
}

\usepackage{xparse}
% \tagx[shown text, optional]{label-name}
\makeatletter
\NewDocumentCommand{\tagx}{om}{%
  \IfNoValueTF{#1}
   {% normal equation number
    \refstepcounter{equation}(\theequation)\label{#2}%
   }
   {% personal tag
    (#1)\def\@currentlabel{#1}\label{#2}%
   }%
}
\makeatother

\usepackage[colorlinks=true]{hyperref} % for highlighting
\begin{document}
\chapter{First Chapter}
An equation for counting: 
\begin{equation}
a+b=c\label{eq:bar1} 
\end{equation}

\bigskip
This is an inline-tag \tagx{foo1}, it is also labeled \eqref{foo1}.

This is a personalized inline-tag \tagx[***]{foo2}, it is also labeled \eqref{foo2}.

\bigskip
This is an inline-tag \tagx{}, it is \emph{not} labeled.

This is a personalized inline-tag \tagx[***]{}, it is \emph{not} labeled.

\bigskip
An another equation: 
\begin{equation}
1+1=2\label{eq:bar2} 
\end{equation}
\end{document}

alt text

gefragt 20 Mai '19, 17:33

cis's gravatar image

cis
9.5k92459491
Akzeptiert-Rate: 29%

bearbeitet 20 Mai '19, 19:18

Wenn Argument #2 leer ist, darfst du daraus keinen label machen. \tl_if_empty:nF{#2}{\label{#2}}.

(20 Mai '19, 18:09) Ulrike Fischer

@Ulrike Fischer Ähh, ist das jetzt schon die Lösung?

(20 Mai '19, 18:20) cis

Wieso pgfkeys und nicht l3keys wenn du bereits L3 verwendest?

(20 Mai '19, 18:30) Skillmon

@Skillmon Äh, weiß ich nicht. Da pgfkey zumindest halbwegs anschaulich und nachvollziehbar ist. Du Syntax \tagx[name=..., label=...] ist auch gut.

(20 Mai '19, 18:33) cis

@Skillmon, da das Beispiel weder das eine noch das andere verwendet, ist es wohl ziemlich egal ;-).

(20 Mai '19, 19:03) Ulrike Fischer

@Ulrike Fischer: Deinen Typ-Befehl finde ich nicht in der xparse-Anleitung. Ich kann darauf nicht aufbauen, tut mir leid.

@Skillmon: Ich bekomme fehlerhaft etwas \tagx[name][label-name] hin; aber das ist nicht schön (auch wenn es mal funktioniert); weil man dann auch sowas wie \tagx[][nur label-name] braucht.

Die pgfkeys-Syntax ist da schon besser: \tagx[name=<Anzeige>, label=<label-Name>]

(20 Mai '19, 19:15) cis

\tagx[name=<Anzeige>, label=<label-Name>] kann man auch mit l3keys (oder keyval, oder xkeyval oder weiteren keyval-Paketen) programmieren. Aber wenn du schon xparse (das zu expl3 gehört) verwendest, ist l3keys eigentlich die logischere Wahl. \tl_if_empty:nT wird in der expl3-Dokumentation interface3.pdf beschrieben.

(20 Mai '19, 19:20) Ulrike Fischer

@Ulrike Fischer: Nein, egal ist das nicht. Eine schöne Lösung, die man sogar versteht und auf der man für spätere Probleme aufbauen kann ist nicht so verkehrt. Daher interessiert mich das insb. mit pgfkeys.

(20 Mai '19, 19:23) cis
Ergebnis 5 von 8 show 3 more comments

Das Folgende ist eine reine LaTeX3 Implementierung, die das l3keys Modul verwendet. Falls du Erläuterungen benötigst, frag einfach. Anstelle von l3keys könnte selbstverständlich auch pgfkeys verwendet werden, das optionale Argument müsste einfach an \pgfkeys statt \keys_set:nn übergeben werden und statt \keys_define:nn würde \pgfkeys auch zum Definieren verwendet.

Öffne in Overleaf
\documentclass[12pt]{scrreprt}

\usepackage[]{amsmath}

\usepackage{xparse} % lädt auch `expl3`

\makeatletter
\ExplSyntaxOn
\keys_define:nn { cis / tagx }
  {
    ,label .tl_set:N = \l__cis_tagx_label_tl
    ,name  .tl_set:N = \l__cis_tagx_name_tl
  }
\NewDocumentCommand \tagx { O{} }
  {
    \group_begin:
    \keys_set:nn { cis / tagx } { #1 }
    \tl_if_empty:NTF \l__cis_tagx_name_tl
      {
        \refstepcounter{equation}
        ( \theequation )
        \tl_if_empty:NF \l__cis_tagx_label_tl
          { \exp_args:NV \label \l__cis_tagx_label_tl }
      }
      {
        ( \l__cis_tagx_name_tl )
        \tl_if_empty:NF \l__cis_tagx_label_tl
          {
            \tl_set_eq:NN \@currentlabel \l__cis_tagx_name_tl
            \exp_args:NV \label \l__cis_tagx_label_tl
          }
      }
    \group_end:
  }
\ExplSyntaxOff
\makeatother

\begin{document}
\chapter{First Chapter}
An equation for counting: 
\begin{equation}
a+b=c\label{eq:bar1} 
\end{equation}

\bigskip
This is an inline-tag \tagx[label=foo1], it is also labeled \eqref{foo1}.

This is a personalized inline-tag \tagx[name=***,label=foo2], it is also labeled \eqref{foo2}.

\bigskip
This is an inline-tag \tagx, it is \emph{not} labeled.

This is a personalized inline-tag \tagx[name=***], it is \emph{not} labeled.

\bigskip
An another equation: 
\begin{equation}
1+1=2\label{eq:bar2} 
\end{equation}
\end{document}

Ergänzung: eine bis auf xparse LaTeX3 freie Implementierung:

Öffne in Overleaf
\documentclass[12pt]{scrreprt}

\usepackage[]{amsmath}

\usepackage{xparse}
\usepackage{pgfkeys}

\makeatletter
\newcommand*\cistagx@label{}
\newcommand*\cistagx@name{}
\pgfkeys
  {%
    /cis/tagx/.cd
    ,label/.store in=\cistagx@label
    ,name/.store in=\cistagx@name
  }
\NewDocumentCommand \tagx { O{} }
  {%
    \begingroup
    \pgfkeys{/cis/tagx/.cd,#1}
    \ifx\cistagx@name\@empty
      \refstepcounter{equation}%
      (\theequation)%
      \ifx\cistagx@label\@empty
      \else
        \expandafter\label\expandafter{\cistagx@label}%
      \fi
    \else
      (\cistagx@name)%
      \ifx\cistagx@label\@empty
      \else
        \let\@currentlabel\cistagx@name
        \expandafter\label\expandafter{\cistagx@label}%
      \fi
    \fi
    \endgroup
  }
\makeatother

\begin{document}
\chapter{First Chapter}
An equation for counting: 
\begin{equation}
a+b=c\label{eq:bar1} 
\end{equation}

\bigskip
This is an inline-tag \tagx[label=foo1], it is also labeled \eqref{foo1}.

This is a personalized inline-tag \tagx[name=***,label=foo2], it is also labeled \eqref{foo2}.

\bigskip
This is an inline-tag \tagx, it is \emph{not} labeled.

This is a personalized inline-tag \tagx[name=***], it is \emph{not} labeled.

\bigskip
An another equation: 
\begin{equation}
1+1=2\label{eq:bar2} 
\end{equation}
\end{document}

Ergänzung 2: Eine Version, die zwar LaTeX3 verwendet, nicht aber l3keys (wieso das bevorzugt werden sollte, ist mir allerdings schleierhaft):

Öffne in Overleaf
\documentclass[12pt]{scrreprt}

\usepackage[]{amsmath}

\usepackage{xparse} % lädt auch `expl3`
\usepackage{pgfkeys}

\makeatletter
\ExplSyntaxOn
\tl_new:N \l__cis_tagx_label_tl
\tl_new:N \l__cis_tagx_name_tl
\pgfkeys
  {%
    /cis/tagx/.cd
    % we have to use `.store~in` instead of `.store in` as the spaces are
    % ignored in expl3 and `~` is a space here.
    ,label/.store~in=\l__cis_tagx_label_tl
    ,name/.store~in=\l__cis_tagx_name_tl
  }
\NewDocumentCommand \tagx { O{} }
  {%
    \group_begin:
    \pgfkeys{/cis/tagx/.cd,#1}
    \tl_if_empty:NTF \l__cis_tagx_name_tl
      {
        \refstepcounter{equation}
        ( \theequation )
        \tl_if_empty:NF \l__cis_tagx_label_tl
          { \exp_args:NV \label \l__cis_tagx_label_tl }
      }
      {
        ( \l__cis_tagx_name_tl )
        \tl_if_empty:NF \l__cis_tagx_label_tl
          {
            \tl_set:Nx \@currentlabel { \l__cis_tagx_name_tl }
            \exp_args:NV \label \l__cis_tagx_label_tl
          }
      }
    \group_end:
  }
\ExplSyntaxOff
\makeatother

\begin{document}
\chapter{First Chapter}
An equation for counting: 
\begin{equation}
a+b=c\label{eq:bar1} 
\end{equation}

\bigskip
This is an inline-tag \tagx[label=foo1], it is also labeled \eqref{foo1}.

This is a personalized inline-tag \tagx[name=***,label=foo2], it is also labeled \eqref{foo2}.

\bigskip
This is an inline-tag \tagx, it is \emph{not} labeled.

This is a personalized inline-tag \tagx[name=***], it is \emph{not} labeled.

\bigskip
An another equation: 
\begin{equation}
1+1=2\label{eq:bar2} 
\end{equation}
\end{document}
Permanenter link

beantwortet 20 Mai '19, 20:57

Skillmon's gravatar image

Skillmon
1.2k6
Akzeptiert-Rate: 46%

bearbeitet 20 Mai '19, 22:35

@Skillmon Erläuterungen... mmmhh... aktuell noch nicht. Also ich fände es gut, wenn Du eine pgfkeys-Lösung ergänzen könntest. Vll. aufbauend auf dem xparse-Code (den ich verstehe), vll. auch nicht. Weil das kann ich dann auch gut für Weiteres und Ähnliches verwenden kann. Bei expl3 stehe ich jedesmal vor einem neuen Problem.

(20 Mai '19, 21:34) cis

@cis ich kann verstehen, wenn man anfangs mit expl3 seine Probleme hat, ging mir ähnlich. Aber wenn man ein wenig interface3.pdf überfliegt wird man angefixt. pgfkeys-Variante im Übrigen ergänzt.

(20 Mai '19, 22:13) Skillmon

@Skillmon Ui... ja ok. Also ich hatte mir das in Gedanken einfacher vorgestellt. Ich dachte, man nimmt den fertigen xparse-Befehl und ergänzt da zwei pgfkeys; bloß einen gescheiten default habe ich nicht hinbekommen.

(20 Mai '19, 22:19) cis

@cis man hätte es auch einfacher umstellen können, aber ich habe mir gedacht, wenn schon ohne l3keys dann auch ohne den Rest :) Ein weiterer Edit, der nur \pgfkeys anstelle von \keys_define:nn und \keys_set:nn verwendet, ist hinzugefügt.

(20 Mai '19, 22:34) Skillmon

Wie dem auch sei: die pgfkeys-Lösung entspricht sehr genau dem, was ich suchte; habe ich hier direkt eingepflegt. Ich hatte irgendwie gehofft, man kann einen fertiges (xparse-)Kommando um pgfkeys ergänzen. Aber die Lösung mit mit ifx-Unterscheidungen ist zwar schwierig, aber nachvollziehbar.

(21 Mai '19, 23:17) cis

@cis wenn du mit xparse expl3 meinst, so kannst du auch \tl_if_empty:NF \cistagx@label { <code> } verwenden.

(22 Mai '19, 16:37) Skillmon
Ergebnis 5 von 6 show 1 more comments
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×32
×5
×4

gestellte Frage: 20 Mai '19, 17:33

Frage wurde gesehen: 4,060 Mal

zuletzt geändert: 22 Mai '19, 16:37