вступление
Недавно я столкнулся с проблемой, связанной с acro
пакетом, когда писал диссертацию с использованием xelatex
.
В моем документе используется fancyhdr
пакет, в котором я устанавливаю заголовок раздела, чтобы он отображался в нижнем колонтитуле. Буквы заголовка раздела отображаются в верхнем регистре.
Проблема
Мне нравится использовать аббревиатуры, когда это возможно. Поэтому я решил использовать запрос на аббревиатуру в названии раздела, например, так:
\section{Moving Forward to Distributed \ac{sdn} Management}
Но по какой-то причине движок посчитал забавным принудительно сделать весь текст в заголовке раздела заглавным, превратив \ac{sdn}
в \ac{SDN}
.
Затем в нижнем колонтитуле документа произошло следующее:
Из-за этого меня мучила фантомная аббревиатура, дважды встречающаяся во вспомогательном файле:
\acro@used@once {SDN}{78}{78}{89}
\acro@used@twice {SDN}{79}{79}{90}
в то время как эти фантомные запросы на аббревиатуру появились в журнале создания документа. В указанных строках не было запросов на аббревиатуру:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! acro error: "undefined"
!
! You've requested acronym `SDN' on line 499 but you apparently haven't
! defined it, yet!
! Maybe you've misspelled `SDN'?
!
! See the acro documentation for further information.
!
! Type <return> to continue.
!...............................................
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! acro error: "undefined"
!
! You've requested acronym `SDN' on line 514 but you apparently haven't
! defined it, yet!
! Maybe you've misspelled `SDN'?
!
! See the acro documentation for further information.
!
! Type <return> to continue.
!...............................................
решение1
Это не обязательно связано с fancyhdr
. То же самое происходит с простым \pagestyle{headings}
в классе статьи.
Проблема в том, что \sectionmark
в \MakeUppercase
заголовке и – поскольку \ac
и друзья являются защищенными командами – изменения \ac{sdn}
в \ac{SDN}
которые затем приводят к сообщению об ошибке.
Одним из очевидных «решений» является определение аббревиатуры с помощью идентификатора, набранного заглавными буквами:
\DeclareAcronym{SDN}{...}
Однако это может оказаться утомительной работой по изменению, в зависимости от количества аббревиатур и вызовов аббревиатур в вашем документе. (Хотя поиск и замена на самом деле могут быть довольно простыми...)
Другой возможностью может быть использование
textcase
пакета, который переопределяет\MakeUppercase
так, чтобы мы могли указать LaTeX не использовать заглавные буквы в определенных частях:\documentclass{article} \usepackage{acro} \usepackage[overload]{textcase} \DeclareAcronym{sdn}{ short = SDN , long = some dummy nonsense } \pagestyle{headings} \begin{document} \section{Moving Forward to Distributed \protect\NoCaseChange{\acs*{sdn}} Management} \end{document}
В качестве третьего варианта, который не зависит от способа определения стиля заголовка, в начале этого года (с выпуском v2.11 2020/01/11)
acro
был представлен вариант для решения такого рода проблем. Если у вас нет двух разных аббревиатур, одна из которых используется как идентификатор, а другая — как , вы можете сказать , что обе они должны рассматриваться как одно и то же:case-sensitive
sdn
SDN
acro
\documentclass{article} \usepackage{acro} \acsetup{case-sensitive=false} \DeclareAcronym{sdn}{ short = SDN , long = some dummy nonsense } \pagestyle{headings} \begin{document} \section{Moving Forward to Distributed \acs*{sdn} Management} \end{document}
Последние два примера оба дают
решение2
Решение
Похоже, что сочетание использования acro
пакета с fancyhdr
пакетом при размещении заголовка раздела в нижнем колонтитуле оказалось глючным. Из-за этого я удалил запрос \ac{sdn}
из заголовка, что решило проблему фантомного \ac{SDN}
запроса.
Теперь нижний колонтитул документа правильный, а фантомные запросы на аббревиатуры исчезли.