У меня есть то, о чем я хотел бы подумать, простой вопрос.
У меня есть следующий текстовый код:
\begin{description}%[style=nextline]
\item [Category\label{desc:category}] blablabla
\item [Profile\label{desc:profile}] blabla (\nameref{desc:category}) blabla.
\end{description}
Результат примерно такой:
Категорияблаблабла
Профильблабла (Категория «куча пробелов») блабла.
Почему у меня есть эти пробелы после ссылки на категорию, которую я сделал?
решение1
Чтобы воспроизвести проблему, о которой вы сообщаете, оказывается необходимым загрузить пакет enumitem
в дополнение к hyperref
(или nameref
) пакету. Например, следующий MWE
\documentclass{article}
\usepackage{enumitem}
\usepackage[colorlinks]{hyperref} % or: \usepackage{nameref}
\begin{document}
\begin{description}
\item[Category\label{desc:category}] blablabla
\item[Profile\label{desc:profile}] blabla
(\nameref{desc:category}) blabla
\end{description}
\end{document}
выдает следующий результат:
Короче говоря, похоже, вы столкнулись с довольно существенным и весьма досадным конфликтом между пакетами enumitem
и hyperref
.Ответ Кристиана Хупфера, который был опубликован на пару минут раньше моего, дает более глубокую диагностику природы конфликта.) Интересно, что три ответа на вопросСправочное имя элемента списка описаний в LaTeXпохоже, не решают проблему интервалов.
Вместо использования пакета enumitem
вы можете рассмотреть возможность использованияперечислитьpackage. Он не предлагает столько наворотов, сколько enumitem
package. Однако, в зависимости от ваших потребностей в форматировании (о которых вы пока не раскрыли ровно ноль...), пакет enumerate
может предложить всю функциональность, которая вам действительно нужна.
Однако, если вы простодолжениспользуйте enumitem
пакет, я предлагаю вамнетиспользовать базовый-LaTeX \label
- \ref
механизм внутри description
окружения. Вместо этого используйте более общий \hypertarget
- \hyperlink
механизм пакета hyperref
.
\documentclass{article}
\usepackage{enumerate}
\usepackage[colorlinks]{hyperref}
\begin{document}
\begin{description}
\item[\hypertarget{desc:category}{Category}] blablabla
\item[\hypertarget{desc:profile}{Profile}] blabla
(\hyperlink{desc:category}{Category}) blabla
\end{description}
\end{document}
решение2
Судя по всему, автор использует enumitem
(подсказка: style=nextline
)
enumitem
добавляет \hfil
в \descriptionlabel
макрос, поэтому метка будет иметь вид Category\hfil
, оставляя большое пространство справа.
Среда description
стандартных классов (лучше: ядро LaTeX) не имеет этой нежелательной особенности.
Идея заключается в том, чтобы \let\hfil\relax
в \@currentlabelname
макросе, представляющем собой имя, которое хранится для \nameref
.
\documentclass{article}
\usepackage{enumitem} % Add easy custom list support
\usepackage{hyperref} % Add ref support
%\setlength\parindent{0pt} % Globally set indentation for new paragraphs
\setlist[description]{labelwidth=0pt,leftmargin=30pt,itemindent=\dimexpr-20pt-\labelsep\relax} % Global Setup Description List
\makeatletter % Redefinition of Description List Items source: http://tex.stackexchange.com/a/1248/13552
\let\orgdescriptionlabel\descriptionlabel
\renewcommand*{\descriptionlabel}[1]{%
\let\orglabel\label
\let\label\@gobble
\phantomsection
\protected@edef\@currentlabel{#1}%
\edef\@currentlabelname{\let\hfil\relax #1}%
\let\label\orglabel
\orgdescriptionlabel{#1}%
}
\makeatother
\begin{document}
\begin{description}
\item [Category\label{desc:category}] blablabla
\item [Profile\label{desc:profile}] blabla (\nameref{desc:category}) blabla.
\end{description}
\end{document}
решение3
Если вы посмотрите на .aux
файл, вы увидите
\newlabel{desc:category}{{}{1}{\enit@align {\enit@format {Category\label {desc:category}}}}{Doc-Start}{}}
\newlabel{desc:profile}{{}{1}{\enit@align {\enit@format {Profile\label {desc:profile}}}}{Doc-Start}{}}
и мы хотим избавиться от \enit@align
и \enit@format
; это можно сделать, загрузив gettitlestring
пакет с expand
опцией и отключив две нежелательные команды, заставив их просто доставлять свой аргумент. Это переопределение является временным, пока nameref
макросы собирают заголовок.
\documentclass{article}
\usepackage{enumitem} % Add easy custom list support
\usepackage[expand]{gettitlestring}
\usepackage{hyperref} % Add ref support
\setlist[description]{% Global Setup Description List
labelwidth=0pt,
leftmargin=30pt,
itemindent=\dimexpr-20pt-\labelsep\relax
}
\makeatletter
\GetTitleStringDisableCommands{%
\let\enit@align\@firstofone
\let\enit@format\@firstofone
}
\makeatother
\begin{document}
\begin{description}
\item [Category\label{desc:category}] blablabla
\item [Profile\label{desc:profile}] blabla (\nameref{desc:category}) blabla.
\end{description}
\end{document}
Теперь .aux
файл имеет
\newlabel{desc:category}{{}{1}{Category}{Doc-Start}{}}
\newlabel{desc:profile}{{}{1}{Profile}{Doc-Start}{}}
и результат соответствует ожиданиям.