首次使用缩写词时更改缩写形式的位置?(使用 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>}是否已被使用来更改其外观rho。不幸的是,在第一次出现时附加文本似乎并不特别容易,而是必须定义一个first-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这些命令将根据是否同时使用了rhograd(在下面的代码中)首字母缩略词来手动组装适当的长形式或短形式。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}%
}

这使用后链接钩子\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则不执行任何操作,因此可以使用默认类别赋予它们相同的样式:user1abbreviation

\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需要最后加载。这是少数例外之一。)

如果在上面的例子中出现任何“未定义的控制序列错误”,请检查您是否拥有最新版本的glossariesglossaries-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}

在此处输入图片描述

相关内容