使用 ocgx2 包的 ocgcolorlinks 选项的 glossaries-extra 和基于 scalebox 的 glsabbrvsmfont/glsnamefont 命令时出现问题

使用 ocgx2 包的 ocgcolorlinks 选项的 glossaries-extra 和基于 scalebox 的 glsabbrvsmfont/glsnamefont 命令时出现问题

下面的例子会导致问题:

\documentclass{article}

\usepackage[colorlinks,linkcolor=blue]{hyperref}
\usepackage[ocgcolorlinks]{ocgx2}

\usepackage[record,acronym,shortcuts=ac]{glossaries-extra}

\usepackage{relsize}
\setabbreviationstyle[\acronymtype]{long-short-sm}

\usepackage{graphicx}
\newcommand{\myfmt}[1]{\scalebox{.35}{#1}}
\renewcommand*{\glsabbrvsmfont}[1]{\myfmt{#1}}%\renewcommand*{\glsnamefont}[1]{\myfmt{#1}}

\newcommand{\glspr}[1]{\glsxtrp{long}{#1}}

\GlsXtrLoadResources[src={entries}, selection={all}, type=\acronymtype, sort={letternumber-upperlower}]

\usepackage{filecontents}
\begin{filecontents}{entries.bib}
    @Acronym{c,
        long  = {ccc},
        short = {C}}
    @Acronym{bc,
        long   = {bbb \glspr{c}},
        parent = {c},
        short  = {BC}}
    @Acronym{abc,
        long   = {aaa \glspr{bc}},
        parent = {bc},
        short  = {ABC}}
    @Acronym{abc-d,
        description = {{}\glspr{abc}~--~\emph{ddd}},
        long        = {{}\glspr{abc} (d)},
        parent      = {abc},
        short       = {ABC-d}}
    @Acronym{abc-d-f,
        description = {{}\glspr{abc-d}~--~fff},
        long        = {{}\glspr{abc} (d, f)},
        parent      = {abc-d},
        short       = {ABC-d-f}}
    @Acronym{abc-d-g,
        description = {{}\glspr{abc-d}~--~ggg},
        long        = {{}\glspr{abc} (d, g)},
        parent      = {abc-d},
        short       = {ABC-d-g}}
    @Acronym{abc-e,
        description = {{}\glspr{abc}~--~\emph{eee}},
        long        = {{}\glspr{abc} (e)},
        parent      = {abc},
        short       = {ABC-e}}
    @Acronym{abc-e-f,
        description = {{}\glspr{abc-e}~--~fff},
        long        = {{}\glspr{abc} (e, f)},
        parent      = {abc-e},
        short       = {ABC-e-f}}
    @Acronym{abc-e-g,
        description = {{}\glspr{abc-e}~--~ggg},
        long        = {{}\glspr{abc} (e, g)},
        parent      = {abc-e},
        short       = {ABC-e-g}}
    @Acronym{h-bc,
        long   = {hhh \glspr{bc}},
        parent = {bc},
        short  = {H-BC}}
    @Acronym{iiii,
        long  = {ii ii ii ii},
        short = {IIII}}
    @Acronym{aaa,
        long  = {aaa aaa aaa},
        short = {AAA}}
    @Acronym{aab,
        long  = {aaa aaa bbb},
        short = {AAB}}
\end{filecontents}

\begin{document}

    \noindent Test: \ac{aab}, \ac{abc-e}, \ac{abc-e-g}.

    \printunsrtglossary[type=\acronymtype,style=treegroup]

\end{document}

不理想的结果。

而期望的结果应该是这样的:

期望的结果。

有一点是,\ac在文档正文中使用命令引用的首字母缩略词在生成的 PDF 中不可见。不过,它们仍然占据所需空间,并且其文本存在于输出中(因为可以将其复制并粘贴到其他地方)。

此外,缩写列表在第一个以-like 命令description开头的字段的中间被打断(在本例中)。\glsabc-d词汇表附加手册该软件包可能会在此类条目方面存在问题(并且这些命令前面应该有空组{}):

如果你真的需要嵌套命令,最安全的方法是

\newabbreviation{shtml}{shtml}{{}\glsxtrp{short}{ssi} enabled \glsxtrp{short}{html}}

但请注意,有时它可能会产生一些意想不到的结果。

然而,这似乎不是这里的核心问题,因为提供的 MWE 在对与嵌套命令不直接相关的声明进行轻微修改后就能正常工作(如下所述)。


一些观察:

  1. 从包中删除ocgcolorlinks选项ocgx2是一种解决方法,但绝对不是一个完整的解决方案。
  2. 更改 \scalebox{.35}{#1}\scalebox{1}{#1}也是一种解决方法,但没有达到所需的效果(可能在这种情况下\scalebox根本不会应用不必要的命令)。
  3. 之前导入glossaries-extrahyperref似乎也有帮助,但随后缩写的彩色链接就丢失了。
  4. 更改\newcommand{\glspr}[1]{\glsxtrp{long}{#1}}为,例如,\newcommand{\glspr}[1]{SOMETEXT\glsxtrp{long}{#1}}似乎可以修复损坏的首字母缩略词列表的问题,但随后一些文本在列表中显示多次,但文档正文中的首字母缩略词仍然没有显示。
  5. 可能很明显,但更改\renewcommand*{\glsabbrvsmfont}[1]{\myfmt{#1}}\renewcommand*{\glsnamefont}[1]{\myfmt{#1}}解决了文档主体中的首字母缩略词的问题(因为基于 的graphicx命令不再适用于它们),但根本问题仍然存在,首字母缩略词列表仍然受到影响(损坏)。\scalebox\myfmt

答案1

使用ocgx2包选项ocgcolorlinks,链接文本中缩放或放入框架的部分以及包含的图形\includegraphics需要特殊处理。只需将\ocglinkprotect{...}它们放在周围即可。

在本案中:

\newcommand{\myfmt}[1]{\ocglinkprotect{\scalebox{.35}{#1}}}

答案2

可以用一个更小的例子来演示相同的问题:

\documentclass{article}

\usepackage[colorlinks,linkcolor=blue]{hyperref}
\usepackage[ocgcolorlinks]{ocgx2}

\usepackage{graphicx}
\newcommand{\myfmt}[1]{\scalebox{.35}{#1}}

\begin{document}
\hypertarget{test}{Test Target}.

\hyperlink{test}{Test Link}.

\hyperlink{test}{\myfmt{Test Link}}.

\myfmt{\hyperlink{test}{Test Link}}.

\end{document}

第二个链接存在但不可见:

测试目标。测试链接。测试链接。

链接文本仍然可以复制,因此它存在于 PDF 中。

第三个链接可见,并达到了预期的效果。

回到glossaries-extra,不幸的是缩写字体在超链接内,重复了上面的第二个链接示例,因此出现了相同的结果。

将格式化命令移出超链接的唯一方法是当格式化命令是设置的一部分\glstextformat(或由textformat属性提供)时hyperoutside=false。这会影响首次使用时的完整格式,因此不能仅用于短格式。

如果你的简短格式中只有文本(并且不需要缩放图像),那么我建议你使用\textscale而不是\scalebox。例如:

\documentclass{article}

\usepackage[colorlinks,linkcolor=blue]{hyperref}
\usepackage[ocgcolorlinks]{ocgx2}

\usepackage{relsize}
\newcommand{\myfmt}[1]{\textscale{.35}{#1}}

\begin{document}
\hypertarget{test}{Test Target}.

\hyperlink{test}{Test Link}.

\hyperlink{test}{\myfmt{Test Link}}.

\myfmt{\hyperlink{test}{Test Link}}.
\end{document}

测试目标。测试链接。测试链接。测试链接。

无论位于超链接内部还是外部,此方法均有效。

\documentclass{article}

\usepackage[colorlinks,linkcolor=blue]{hyperref}
\usepackage[ocgcolorlinks]{ocgx2}

\usepackage[record,acronym,shortcuts=ac]{glossaries-extra}

\usepackage{relsize}
\setabbreviationstyle[acronym]{long-short-sm}

\newcommand{\myfmt}[1]{\textscale{.35}{#1}}
\renewcommand*{\glsabbrvsmfont}[1]{\myfmt{#1}}

\newcommand{\glspr}[1]{\glsxtrp{long}{#1}}

\GlsXtrLoadResources[src={entries}, selection={all}, type=\acronymtype, sort={letternumber-upperlower}]

\usepackage{filecontents}
\begin{filecontents}{entries.bib}
    @Acronym{c,
        long  = {ccc},
        short = {C}}
    @Acronym{bc,
        long   = {bbb \glspr{c}},
        parent = {c},
        short  = {BC}}
    @Acronym{abc,
        long   = {aaa \glspr{bc}},
        parent = {bc},
        short  = {ABC}}
    @Acronym{abc-d,
        description = {{}\glspr{abc}~--~\emph{ddd}},
        long        = {{}\glspr{abc} (d)},
        parent      = {abc},
        short       = {ABC-d}}
    @Acronym{abc-d-f,
        description = {{}\glspr{abc-d}~--~fff},
        long        = {{}\glspr{abc} (d, f)},
        parent      = {abc-d},
        short       = {ABC-d-f}}
    @Acronym{abc-d-g,
        description = {{}\glspr{abc-d}~--~ggg},
        long        = {{}\glspr{abc} (d, g)},
        parent      = {abc-d},
        short       = {ABC-d-g}}
    @Acronym{abc-e,
        description = {{}\glspr{abc}~--~\emph{eee}},
        long        = {{}\glspr{abc} (e)},
        parent      = {abc},
        short       = {ABC-e}}
    @Acronym{abc-e-f,
        description = {{}\glspr{abc-e}~--~fff},
        long        = {{}\glspr{abc} (e, f)},
        parent      = {abc-e},
        short       = {ABC-e-f}}
    @Acronym{abc-e-g,
        description = {{}\glspr{abc-e}~--~ggg},
        long        = {{}\glspr{abc} (e, g)},
        parent      = {abc-e},
        short       = {ABC-e-g}}
    @Acronym{h-bc,
        long   = {hhh \glspr{bc}},
        parent = {bc},
        short  = {H-BC}}
    @Acronym{iiii,
        long  = {ii ii ii ii},
        short = {IIII}}
    @Acronym{aaa,
        long  = {aaa aaa aaa},
        short = {AAA}}
    @Acronym{aab,
        long  = {aaa aaa bbb},
        short = {AAB}}
\end{filecontents}

\begin{document}

    \noindent Test: \ac{aab}, \ac{abc-e}, \ac{abc-e-g}.

    \printunsrtglossary[type=\acronymtype,style=treegroup]

\end{document}

文件图像

(无关:的可选参数\setabbreviationstyle应该是类别标签。该命令\acronymtype用于引用词汇表而不是类别。在原始 MWE 中,恰好扩展为与所需类别标签相同的值,但它们不一定相同,因此最好不要在需要类别标签的上下文中\acronymtype使用。)\acronymtype

相关内容