我想问一个简单的问题。
我有以下 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}
产生以下输出:
简而言之,你似乎遇到了一个相当重大和相当不幸的冲突,enumitem
即hyperref
包之间相当严重且非常不幸的冲突。(Christian Hupfer 的回答,比我的早几分钟发布,对冲突的性质进行了更深入的诊断。)有趣的是,对这个问题的三个答案LaTeX 中描述列表项的参考名称似乎没有解决间距问题。
而不是使用enumitem
包之外,您还可以考虑使用枚举软件包。它提供的附加功能不如软件包那么多enumitem
。但是,根据您的格式化需求(到目前为止您没有透露任何内容...),该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
显然 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}{}}
并且输出符合预期。