Изменить расположение краткой формы в аббревиатуре при первом использовании? (используя acro.sty)

Изменить расположение краткой формы в аббревиатуре при первом использовании? (используя acro.sty)

Учитывая следующую MWE, есть ли способ изменить местоположение сокращенной формы при первом использовании (полной), чтобы она не всегда появлялась после печати полной формы?

\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}

введите описание изображения здесь

Если нет, может ли быть новый набор команд для использования в \DeclareAcronymблоке? Так что объявление может выглядеть так

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

Где \shortбудет заменено пробелом (обратите внимание, что перед нет пробела \short), за которым следует краткая форма в скобках? Аналогичные команды можно добавить для других аргументов по \DeclareAcronymмере необходимости.

решение1

Макрос \DeclareAcroFirstStyleмог бы в будущем предоставить интерфейс для достижения этой цели, но с текущими возможностями, доступными для него, я не смог ничего придумать. На данный момент я могу найти два способа сделать это, но оба с потенциальными проблемами, которые будут мешать другимacroфункции.

Используя \acifused{<id>}{<true>}{<false>}макрос, мы можем адаптировать longзапись для изменения ее внешнего вида в зависимости от того , использовалась \DeclareAcronym{grad}{<keys>}ли аббревиатура . К сожалению, кажется, не так уж просто добавить текст к первому появлению, вместо этого мне пришлось определить , который печатал только длинную форму и включал короткую форму в длинную какrhofirst-style

\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,
}

Хотя это и генерирует первые появления, как и хотелось бы, это не так хорошо работает с \acl{grad}, который все равно будет генерировать краткую форму в квадратных скобках, как и

\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}

введите описание изображения здесь


Альтернативноacroпозволяет вручную создавать \acкоманды, подобные -, которые мы можем использовать для создания чего-то специально для gradакронима, что вручную соберет соответствующую длинную или короткую форму в зависимости от того, были ли использованы оба акронима - rhoи - grad(в коде ниже ).gradtwo

\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

Преимущество этого longварианта в том, что он остается нетронутым и \acgradиспользуется вместо \ac{grad}с минимальными дополнительными трудностями, но все варианты, эквивалентные \Ac{grad}, \acp{grad}и т. д., должны быть определены вручную, чтобы они имели соответствующее первое появление.

Сравнивая эти две стратегии

\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}

введите описание изображения здесь

решение2

Поскольку никто не предоставил ответ с acroпакетом, вот решение с использованием glossaries-extra. Это определяет пользовательский стиль ofother, который проверяет, user1было ли задано поле. Если это так, то значение берется как метка для другого символа и выполняется "of ..." (в противном случае ничего не происходит). Это делается с помощью пользовательской \ofotherкоманды, которая принимает метку в качестве аргумента:

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

Пользовательский ofotherстиль, использующий эту команду:

\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}%
}

При этом используется хук post-link для добавления \ofother{\glslabel}после первого использования.

Вы можете задать различные стили в зависимости от категории записи. Например:

\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}

Однако, поскольку \ofotherничего не делает, если user1не задано, им можно задать тот же стиль, используя только abbreviationкатегорию по умолчанию:

\setabbreviationstyle{ofother}

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

Вот полный документ:

\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}

Это производит:

Первое использование: градиент (∇ρ) плотности заряда электрона (ρ). Следующее использование: ∇ρ. Вот плотность заряда электрона (ρ). Сбросить все. Первое использование снова: плотность заряда электрона (ρ) и градиент (∇ρ) плотности заряда электрона (ρ).

Первое использование gradне отменяет rho. Если его нужно отменить в то же время, то для этого нужно просто внести небольшое изменение в \ofother:

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

Если вам нужен список всех символов, самый простой метод — использовать , \printunsrtglossaryкоторый перечислит все определенные записи в порядке определения:

\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}

изображение документа со списком символов

Естьмножество предопределенных стилей глоссарияесли вам не нравится значение по умолчанию.

Если вы хотите использовать, hyperrefубедитесь, что он загружен заранее glossaries-extra:

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

(Как правило, hyperrefего необходимо загружать в последнюю очередь. Это одно из немногих исключений.)

Если в приведенном выше примере вы получили какие-либо «неопределенные ошибки управляющей последовательности», проверьте, установлены ли у вас последние версииglossariesиglossaries-extra.

решение3

Со вчерашним обновлением до v2.8 acroесть свойство post, которое позволяет добавлять что-либо к акрониму. Также есть команда, \aciffirst{true}{false}с помощью которой можно проверить, используется ли акроним в первый раз:

\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}

введите описание изображения здесь

Связанный контент