我尝试将tufte-handout
文档类与verse
包一起使用。但是,似乎默认tufte-handout
加载hyperref
,这会导致以下错误verse.sty
:
! LaTeX Error: Command \theHpoemline already defined.
研究解决方案让我得到了这个答案: 在 Tufte 讲义类中正确使用超链接选项的方法是什么?
nohyper
使用文档类上的选项加载tufte-handout
确实允许verse
包运行,但我还需要该hyperref
包。(hyperref
事后加载仍然会导致相同的错误。)
我该如何处理这种明显的不兼容性?
梅威瑟:
\documentclass{tufte-handout}
\usepackage{verse}
\begin{document}
\begin{verse}
A sprig, with its flower, I break.
\end{verse}
\end{document}
答案1
这应该可行:暂时禁用加载hyperref
并在之后加载verse
。verse
(不必要的?)定义\theHpoemline
计数器格式,在我看来。
\documentclass[nohyper]{tufte-book}
\usepackage{verse}
\usepackage{hyperref}
\begin{document}
\begin{verse}
A sprig, with its flower, I break.
\end{verse}
\end{document}
一个肮脏的解决办法,不需要直接改变verse.sty
由于verse.sty
定义了一个计数器poemline
,hyperref
将自动执行\theHpoemline
定义。然而,这很糟糕,因为
\newcommand*{\theHpoemline}{\arabic{verse@envctr}.\arabic{poemline}}
用于verse.sty
。
一种解决方法是暂时使用\providecommand
而不是\newcommand
,它不会抱怨已经存在的命令,并且在verse
加载后切换回\newcommand
。
\documentclass{tufte-book}
%\hypersetup{colorlinks=true} Not needed, just for debug
\let\orignewcommand\newcommand % store the original \newcommand
\let\newcommand\providecommand % make \newcommand behave like \providecommand
\RequirePackage{verse}
\let\newcommand\orignewcommand % use the original `\newcommand` in future
\makeatletter
% Use the original definition from verse.sty
\renewcommand*{\theHpoemline}{\arabic{verse@envctr}.\arabic{poemline}}
\makeatother
\begin{document}
\tableofcontents
\chapter{first}
\chapter{second}
\begin{verse}
A sprig, with its flower, I break.
\end{verse}
\end{document}
答案2
我遇到了同样的问题,并通过在\hyperref
加载之前加载包整齐地解决了它\verse
。