为什么我在下一个单词前有一个空格?如何解决?

为什么我在下一个单词前有一个空格?如何解决?

我想问一个简单的问题。

我有以下 tex 代码:

\begin{description}%[style=nextline]
\item [Category\label{desc:category}] blablabla
\item [Profile\label{desc:profile}] blabla (\nameref{desc:category}) blabla.
\end{description}

结果是这样的:

类别啦啦啦

轮廓blabla(类别‘一堆空间’)blabla。

为什么我在引用类别后出现了这些空格?

答案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}

产生以下输出:

在此处输入图片描述

简而言之,你似乎遇到了一个相当重大和相当不幸的冲突,enumitemhyperref包之间相当严重且非常不幸的冲突。(Christian Hupfer 的回答,比我的早几分钟发布,对冲突的性质进行了更深入的诊断。)有趣的是,对这个问题的三个答案LaTeX 中描述列表项的参考名称似乎没有解决间距问题。

而不是使用enumitem包之外,您还可以考虑使用枚举软件包。它提供的附加功能不如软件包那么多enumitem。但是,根据您的格式化需求(到目前为止您没有透露任何内容...),该enumerate软件包可能提供您真正需要的所有功能。


然而,如果你只是必须使用enumitem包,我建议你不是在环境中使用基本 LaTeX\label机制。相反,使用包的更通用机制。\refdescription\hypertarget\hyperlinkhyperref

在此处输入图片描述

\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

显然 OP 正在使用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}{}}

并且输出符合预期。

在此处输入图片描述

相关内容