Почему у меня пробел перед следующим словом? Как это исправить?

Почему у меня пробел перед следующим словом? Как это исправить?

У меня есть то, о чем я хотел бы подумать, простой вопрос.

У меня есть следующий текстовый код:

\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. Он не предлагает столько наворотов, сколько enumitempackage. Однако, в зависимости от ваших потребностей в форматировании (о которых вы пока не раскрыли ровно ноль...), пакет 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}{}}

и результат соответствует ожиданиям.

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

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