Position der Kurzform bei erster Verwendung des Akronyms ändern? (mithilfe von acro.sty)

Position der Kurzform bei erster Verwendung des Akronyms ändern? (mithilfe von acro.sty)

Gibt es angesichts des folgenden MWE eine Möglichkeit, die Position der Kurzform bei der ersten Verwendung (vollständig) zu ändern, sodass sie nicht immer nach dem Drucken der Langform angezeigt wird?

\documentclass[]{article}
\usepackage{acro,bm}
\DeclareAcronym{rho}{
    short=$\rho$,
    long=electron charge density
}
\DeclareAcronym{grad}{
    short=$\bm{\nabla}$\hspace{-1.2pt}$\bm{\rho}$,
    long=gradient of \ac{rho}
}

\begin{document}

first use of grad:
\ac{grad}

would rather have:
gradient (\acs{grad}) of \acf{rho}

\end{document}

Bildbeschreibung hier eingeben

Wenn nicht, könnte es einen neuen Befehlssatz geben, der innerhalb des \DeclareAcronymBlocks verwendet werden kann? Die Deklaration könnte also stattdessen so aussehen:

\DeclareAcronym{grad}{
    short=$\bm{\nabla}$\hspace{-1.2pt}$\bm{\rho}$,
    long=gradient\short of \ac{rho}
}

Wo \shortwürde durch ein Leerzeichen ersetzt werden (beachten Sie, dass vor kein Leerzeichen steht \short), gefolgt von der eingeklammerten Kurzform? Ähnliche Befehle könnten bei \DeclareAcronymBedarf für andere Argumente hinzugefügt werden.

Antwort1

Das \DeclareAcroFirstStyleMakro könnte in Zukunft eine Schnittstelle bereitstellen, um dies zu erreichen, aber mit den aktuellen Optionen, die ihm zur Verfügung stehen, konnte ich nichts ausarbeiten. So wie es aussieht, könnte ich zwei Möglichkeiten finden, dies zu tun, aber beide mit potenziellen Problemen, die andere beeinträchtigenacroMerkmale.

Mithilfe des \acifused{<id>}{<true>}{<false>}Makros können wir den longEintrag von anpassen, sodass \DeclareAcronym{grad}{<keys>}sein Erscheinungsbild je nachdem, ob das Akronym rhoverwendet wurde, geändert wird. Leider scheint es nicht besonders einfach zu sein, Text an den ersten Eintrag anzuhängen. Stattdessen musste ich ein definieren, first-styledas nur die Langform ausgibt und die Kurzform in die Langform einschließt.

\DeclareAcroFirstStyle{conditional}{inline}{
    only-long=true
}
\DeclareAcronym{grad}{
    short=$\bm{\nabla}$\hspace{-1.2pt}$\bm{\rho}$,
    long=gradient \acifused{rho}{of \ac{rho} (\acs{grad})}{(\acs{grad}) of \acl{rho} (\acs{rho})},
    first-style=conditional,
}

Dies erzeugt zwar die gewünschten ersten Auftritte, funktioniert aber nicht so gut mit \acl{grad}, das immer noch eine eingeklammerte Kurzform erzeugt, also

\documentclass{article}
\usepackage{acro,bm}

\DeclareAcroFirstStyle{conditional}{inline}{
only-long=true
}

\DeclareAcronym{rho}{
    short=$\rho$,
    long=electron charge density,
}
\DeclareAcronym{grad}{
    short=$\bm{\nabla}$\hspace{-1.2pt}$\bm{\rho}$,
    long=gradient \acifused{rho}{of \ac{rho} (\acs{grad})}{(\acs{grad}) of \acl{rho} (\acs{rho})},
    first-style=conditional,
}
\DeclareAcronym{gradtwo}{
    short=$\bm{\nabla}$\hspace{-1.2pt}$\bm{\rho}$,
    long=gradient of \acs{rho}
}

\begin{document}
\ac{grad}

\acuse{rho}
\acf{grad}

\ac{grad}

\acl{grad}

\acreset{rho}
\acl{grad}
\end{document}

Bildbeschreibung hier eingeben


Alternativeacroermöglicht die manuelle Erstellung von \ac-ähnlichen Befehlen, die wir verwenden können, um etwas speziell für das gradAkronym zu konstruieren, das manuell die entsprechende Lang- oder Kurzform zusammenstellt, je nachdem, ob sowohl das rhoals auch grad(im Code unten gradtwo) Akronyme verwendet wurden.

\ExplSyntaxOn
\NewDocumentCommand \acgrad {s}
{
    \acro_begin:
    \acro_reset_specials:
    \acro_check_and_mark_if:nn {#1}{gradtwo}
    \acro_if_acronym_used:nTF {gradtwo}
    {
        \acro_short:n {gradtwo}
    }{
        \acro_if_acronym_used:nTF {rho}
        {
            \acro_long:n {gradtwo}~(\acro_short:n {gradtwo})
        }{
            gradient~(\acro_short:n {gradtwo})~of~\acro_long:n {rho}~(\acro_short:n {rho})
        }
    }
    \acro_end:
}
\ExplSyntaxOff

Dies hat den Vorteil, dass die longVersion unverändert bleibt und mit minimalem zusätzlichen Aufwand \acgradanstelle von verwendet werden kann. \ac{grad}Alle Varianten, die das Äquivalent von usw. erzielen sollen \Ac{grad}, \acp{grad}müssen jedoch manuell definiert werden, damit sie das entsprechende erste Auftreten gemeinsam haben.

Vergleich dieser beiden Strategien

\documentclass[]{article}
\usepackage{acro,bm}

\DeclareAcroFirstStyle{conditional}{inline}{
only-long=true
}

\DeclareAcronym{rho}{
    short=$\rho$,
    long=electron charge density,
}
\DeclareAcronym{grad}{
    short=$\bm{\nabla}$\hspace{-1.2pt}$\bm{\rho}$,
    long=gradient \acifused{rho}{of \ac{rho} (\acs{grad})}{(\acs{grad}) of \acl{rho} (\acs{rho})},
    first-style=conditional,
}
\DeclareAcronym{gradtwo}{
    short=$\bm{\nabla}$\hspace{-1.2pt}$\bm{\rho}$,
    long=gradient of \acs{rho}
}

\ExplSyntaxOn
\NewDocumentCommand \acgrad {s}
{
    \acro_begin:
    \acro_reset_specials:
    \acro_check_and_mark_if:nn {#1}{gradtwo}
    \acro_if_acronym_used:nTF {gradtwo}
    {
        \acro_short:n {gradtwo}
    }{
        \acro_if_acronym_used:nTF {rho}
        {
            \acro_long:n {gradtwo}~(\acro_short:n {gradtwo})
        }{
            gradient~(\acro_short:n {gradtwo})~of~\acro_long:n {rho}~(\acro_short:n {rho})
        }
    }
    \acro_end:
}
\ExplSyntaxOff

\begin{document}
\ac{grad}

\acuse{rho}
\acf{grad}

\ac{grad}

%\acreset{rho}
\acl{grad}

\hrule

\acreset{rho}
\acgrad

\acreset{gradtwo}
\acgrad

\acgrad

\acl{gradtwo}
\end{document}

Bildbeschreibung hier eingeben

Antwort2

Da niemand eine Antwort mit dem acroPaket bereitgestellt hat, hier eine Lösung mit glossaries-extra. Dies definiert einen benutzerdefinierten Stil ofother, der überprüft, ob das user1Feld festgelegt wurde. Wenn dies der Fall ist, wird der Wert als Bezeichnung für das andere Symbol verwendet und „von ...“ wird ausgeführt (sonst geschieht nichts). Dies wird mit dem benutzerdefinierten \ofotherBefehl durchgeführt, der die Bezeichnung als Argument verwendet:

\newcommand*{\ofother}[1]{%
 \ifglshasfield{user1}{#1}%
 {\space of \glsentrylong{\glscurrentfieldvalue}
  (\glsxtrshort{\glscurrentfieldvalue})}%
 {}%
}

Der benutzerdefinierte ofotherStil, der diesen Befehl verwendet, ist:

\newabbreviationstyle{ofother}
{%
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\the\glsshorttok},
    sort={\the\glslabeltok},
    first={\the\glslongtok\space(\the\glsshorttok)},
    description={\the\glslongtok\protect\ofother{\the\glslabeltok}}
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \ofother{\glslabel}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}
{%
  \GlsXtrUseAbbrStyleFmts{long-short}%
}

Dies verwendet den Post-Link-Hook zum Anhängen \ofother{\glslabel}nach der ersten Verwendung.

Sie können je nach Kategorie des Eintrags unterschiedliche Stile festlegen. Beispiel:

\setabbreviationstyle[symbol]{long-short}    
\setabbreviationstyle[of]{ofother}

\newabbreviation[category=symbol]{rho}{$\rho$}{electron charge density}
\newabbreviation
 [category=of,user1=rho]
 {grad}
 {$\bm{\nabla}$\hspace{-1.2pt}$\bm{\rho}$}
 {gradient}

Da jedoch \ofothernichts passiert, wenn user1es nicht festgelegt wurde, kann ihnen mit nur der Standardkategorie der gleiche Stil zugewiesen werden abbreviation:

\setabbreviationstyle{ofother}

\newabbreviation{rho}{$\rho$}{electron charge density}
\newabbreviation
 [user1=rho]
 {grad}
 {$\bm{\nabla}$\hspace{-1.2pt}$\bm{\rho}$}
 {gradient}

Hier ist ein vollständiges Dokument:

\documentclass{article}

\usepackage{bm}
\usepackage[shortcuts]{glossaries-extra}

\newcommand*{\ofother}[1]{%
 \ifglshasfield{user1}{#1}%
 {\space of \glsentrylong{\glscurrentfieldvalue}
  (\glsxtrshort{\glscurrentfieldvalue})}%
 {}%
}

\newabbreviationstyle{ofother}
{%
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\the\glsshorttok},
    sort={\the\glslabeltok},
    first={\the\glslongtok\space(\the\glsshorttok)},
    description={\the\glslongtok\protect\ofother{\the\glslabeltok}}
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \ofother{\glslabel}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}
{%
  \GlsXtrUseAbbrStyleFmts{long-short}%
}

\setabbreviationstyle{ofother}

\newabbreviation{rho}{$\rho$}{electron charge density}
\newabbreviation
 [user1=rho]
 {grad}
 {$\bm{\nabla}$\hspace{-1.2pt}$\bm{\rho}$}
 {gradient}

\begin{document}
First use: \ac{grad}.

Next use: \ac{grad}.

Here's \ac{rho}.

Reset all.\glsresetall

First use again: \ac{rho} and \ac{grad}.

\end{document}

Das Ergebnis:

Erste Verwendung: Gradient (∇ρ) der Elektronenladungsdichte (ρ). Nächste Verwendung: ∇ρ. Hier ist die Elektronenladungsdichte (ρ). Alles zurücksetzen. Erste erneute Verwendung: Elektronenladungsdichte (ρ) und Gradient (∇ρ) der Elektronenladungsdichte (ρ).

Die erste Verwendung von gradführt nicht zu einer Rücknahme rho. Wenn es gleichzeitig zurückgenommen werden muss, ist nur eine kleine Änderung an erforderlich \ofother:

\newcommand*{\ofother}[1]{%
 \ifglshasfield{user1}{#1}%
 {\space of \glsentrylong{\glscurrentfieldvalue}
  (\glsxtrshort{\glscurrentfieldvalue}\glsunset{\glscurrentfieldvalue})}%
 {}%
}

Wenn Sie eine Liste aller Symbole wünschen, verwenden Sie am einfachsten die Methode \printunsrtglossary, bei der alle definierten Einträge in der Reihenfolge ihrer Definition aufgelistet werden:

\documentclass{article}

\usepackage{bm}
\usepackage[shortcuts]{glossaries-extra}

\newcommand*{\ofother}[1]{%
 \ifglshasfield{user1}{#1}%
 {\space of \glsentrylong{\glscurrentfieldvalue}
  (\glsxtrshort{\glscurrentfieldvalue}\glsunset{\glscurrentfieldvalue})}%
 {}%
}

\newabbreviationstyle{ofother}
{%
  \renewcommand*{\CustomAbbreviationFields}{%
    name={\the\glsshorttok},
    sort={\the\glslabeltok},
    first={\the\glslongtok\space(\the\glsshorttok)},
    description={\the\glslongtok\protect\ofother{\the\glslabeltok}}
  }%
  \renewcommand*{\GlsXtrPostNewAbbreviation}{%
    \csdef{glsxtrpostlink\glscategorylabel}{%
      \glsxtrifwasfirstuse
      {%
        \ofother{\glslabel}%
      }%
      {}%
    }%
    \glshasattribute{\the\glslabeltok}{regular}%
    {%
      \glssetattribute{\the\glslabeltok}{regular}{false}%
    }%
    {}%
  }%
}
{%
  \GlsXtrUseAbbrStyleFmts{long-short}%
}

\setabbreviationstyle{ofother}

\newabbreviation{rho}{$\rho$}{electron charge density}
\newabbreviation
 [user1=rho]
 {grad}
 {$\bm{\nabla}$\hspace{-1.2pt}$\bm{\rho}$}
 {gradient}

\begin{document}
First use: \ac{grad}.

Next use: \ac{grad}.

Here's \ac{rho}.

Reset all.\glsresetall

First use again: \ac{rho} and \ac{grad}.

\printunsrtglossary[title=Symbols,nogroupskip]

\end{document}

Bild eines Dokuments mit einer Liste von Symbolen

Es gibtviele vordefinierte Glossarstilewenn Ihnen die Standardeinstellung nicht gefällt.

Wenn Sie es verwenden möchten, hyperrefstellen Sie sicher, dass es vorher geladen ist glossaries-extra:

\usepackage[colorlinks]{hyperref}
\usepackage[shortcuts]{glossaries-extra}

(Muss im Allgemeinen hyperrefzuletzt geladen werden. Dies ist eine der wenigen Ausnahmen.)

Wenn Sie im obigen Beispiel Fehler wegen nicht definierter Steuersequenzen erhalten, überprüfen Sie, ob Sie aktuelle Versionen vonglossariesUndglossaries-extra.

Antwort3

Mit dem gestrigen Update auf v2.8 acrogibt es die Eigenschaft post, die es erlaubt, einem Akronym etwas voranzustellen. Außerdem gibt es den Befehl, \aciffirst{true}{false}mit dem man testen kann, ob das Akronym beim ersten Mal verwendet wird:

\documentclass{article}
\usepackage{acro,bm}

\DeclareAcronym{rho}{
  short = $\rho$,
  long  = electron charge density
}
\DeclareAcronym{grad}{
  short = $\bm{\nabla}$\hspace{-1.2pt}$\bm{\rho}$,
  long  = gradient ,
  post  = \aciffirst{ of \ac{rho}}{}
}

\begin{document}

first use of grad:
\ac{grad}

\acs{grad}

\end{document}

Bildbeschreibung hier eingeben

verwandte Informationen