使用脚注到尾注 MWE 时出现“未定义的控制序列”

使用脚注到尾注 MWE 时出现“未定义的控制序列”

笔记:此贴文已扩充以反映相关问题。请参阅更新以下:

当我使用下面的 MWE 时,我看到以下错误“未定义的控制序列”...

./Fnote.tex:15: 未定义控制序列。\hyper@normalise ...M{ }\catcode `%\active \let % @percentchar \let %@per... l.15 ...t amet.\footnote{\url{https://google.com}}

我正在使用 Scrivener 和 LaTeX。Scrivener 本身不支持尾注,因此我尝试使用以下方法\fnote宏来适应尾注。

  1. 该宏首先测试尾注是否存在(例如,文本字符串是否以字符 @'at' 符号开头),然后如果存在
  2. 从尾注开头删除 @'at' 符号,然后
  3. 使用 @'at' 符号后面的任何文本调用 \endnote 宏,然后
  4. 如果没有找到@'at'符号,则文本字符串将被视为脚注。

如果宏有效,它将允许使用脚注作为尾注,因为 Scrivener 本身并不支持尾注。

非常感谢任何想法或评论。

\documentclass{article}
\usepackage{endnotes} %
\usepackage{ifthen}
\usepackage{xstring}
\usepackage{hyperref}

\let\fnote\footnote
\renewcommand{\footnote}[1]{
    \IfBeginWith{#1}{@}
        {\endnote{\StrDel[1]{#1}{@}}} %%
        {\fnote{#1}}
}

\begin{document}
Lorem ipsum dolor sit amet.\footnote{\url{https://google.com}}

% Nesting of \footnote{ ... \url{...} ... } throws an error.

\theendnotes %
\end{document}

更新:根据 Domenjoud 的建议,我添加了之前发布的后续项目的结果。Domenjoud 对原始帖子的解决方案(利用开头的 @ 字符从脚注切换到尾注)效果非常好。然而,尝试扩展 Domenjoud 的解决方案以用于 footnotemark+footnotetext 时,出现了一些问题。

在下面的 MWE 中,我强调了当使用初始 @ 字符通过脚注标记 + 脚注文本将脚注移动到尾注时,脚注到尾注的转换如何表现。

   \documentclass{article}

\usepackage{endnotes}
\usepackage{hyperref}
\usepackage{lipsum}
\usepackage{xcolor}
\usepackage[T1]{fontenc}

% \footnote -> \fnote
\let\fnote\footnote

\renewcommand\footnote[1]{\xfnt#1\empty\xfnt}

\long\def\xfnt#1#2\xfnt{%
  \def\tempa{#1}%
  \def\tempb{@}%
  \ifx\tempa\tempb
    \endnote{#2}%
  \else
    \fnote{#1#2}%
  \fi
}

% \footnotetext -> \fnotetext
\let\fnotetext\footnotetext

\renewcommand\footnotetext[1]{\xfntext#1\empty\xfntext}

\long\def\xfntext#1#2\xfntext{%
  \def\tempc{#1}%
  \def\tempd{@}%
  \ifx\tempc\tempd
    \endnote{#2}%
  \else
    \fnotetext{#1#2}%
  \fi
}

% Color endnotes red
\makeatletter
\renewcommand*\makeenmark{\hbox{\textcolor{red}{\textsuperscript{\@Alph{\theenmark}}}}}
\makeatother

% Change endnotes to Alph
\makeatletter
\def\enoteformat{%
  \rightskip\z@ \leftskip\z@ \parindent=1.8em
  \leavevmode{\setbox\z@=\lastbox}\llap{%
  \@Alph\theenmark.\enskip}%
}
\makeatother

\begin{document}

\lipsum[1][1-3] (\textcolor{cyan}{1st \textbf{Foot}note} via "\textcolor{purple}{\textbf{footnote -> fnote}}").\,\footnote{This is \textcolor{cyan}{1st \textbf{Foot}note} via "\textcolor{purple}{\textbf{footnote -> fnote}}". Google. \url{http://www.google.com}} Works Great! \par
\par
\lipsum[1][3-4] (\textcolor{cyan}{1st \textbf{End}note} via "\textcolor{purple}{\textbf{footnote -> fnote}}").\,\footnote{@\,This is the \textcolor{cyan}{1st \textbf{End}note} via "\textcolor{purple}{\textbf{footnote -> fnote}}". Google (Germany). \url{http://www.google.de}} Also works great !\par
\par
\lipsum[2][1-3] (\textcolor{cyan}{2nd \textbf{End}note} via "\textcolor{violet}{\textbf{footnotetext -> fnotetext}}").\footnotemark\;\lipsum[2][4-7] Doesn't work so great ... :( \par

\footnotetext{@\,\textcolor{cyan}{2nd \textbf{End}note} via "\textcolor{violet}{\textbf{footnotetext -> fnotetext}}". CNN (US). \url{https://www.cnn.com}} \par

\lipsum[3][1-3] (\textcolor{cyan}{3rd \textbf{End}note} via "\textcolor{violet}{\textbf{footnotetext -> fnotetext}}").\footnotemark \lipsum[3][4-7] Also doesn't work so great ... :( \par

\footnotetext{@\,\textcolor{cyan}{3rd \textbf{End}note} via "\textcolor{violet}{\textbf{footnotetext -> fnotetext}}". CNN Europe. \url{https://www.cnn.com/europe}} \par

\theendnotes    % Print the endnotes
\end{document}

使用 @ 将脚注转换为尾注 第一个脚注通过“脚注 -> fnote”

注意尾注尾注 B尾注 C无法替换尾注 2尾注 3分别显著抵消低于它们应该出现的位置。

当脚注标记+脚注文本与 LaTeX 中的 @ 符号结合使用minipage以将脚注转换为尾注时,抵消更加明显。

关于如何正确替换 尾注 2尾注 3尾注 B尾注 C同时保留使用 @ 字符将脚注移至尾注的能力,这将受到赞赏。

谢谢。

答案1

问题是\IfBeginWith扩展了它的参数,当\url。使用 时,也会出现相同的错误\edef\foo{\url{whatever}}

解决方案是避免使用 xstring。

\documentclass{article}

\usepackage{endnotes}
\usepackage{hyperref}

\let\fnote\footnote

\renewcommand\footnote[1]{\xfnt#1\empty\xfnt}

\long\def\xfnt#1#2\xfnt{%
  \def\tempa{#1}%
  \def\tempb{@}%
  \ifx\tempa\tempb
    \endnote{#2}%
  \else
    \fnote{#1#2}%
  \fi
}

\begin{document}

Lorem\footnote{@\url{https://www.ilo.org/wcmsp5/groups/public/---ed_dialogue/---sector/documents/meetingdocument/wcms_741659.pdf}} ipsum dolor sit amet.\footnote{\url{https://www.ilo.org/wcmsp5/groups/public/---ed_dialogue/---sector/documents/meetingdocument/wcms_741659.pdf}}

\theendnotes
\end{document}

为了回答您的最后一个问题并获得与 相同的效果,\footnotetext您可以简单地模仿 的重新定义\footnote。虽然\footnote它本身使用\footnotetext,但它应该可以工作。

\let\fnotetext\footnotetext

\renewcommand\footnotetext[1]{\xfntext#1\empty\xfntext}

\long\def\xfntext#1#2\xfntext{%
  \def\tempa{#1}%
  \def\tempb{@}%
  \ifx\tempa\tempb
    \endnote{#2}%
  \else
    \fnotetext{#1#2}%
  \fi
}

相关内容