后续宏检测

后续宏检测

我想检测后续的宏,以便插入上标数字。如果两个宏彼此相连,则应在它们之间插入逗号。

最小示例(删除了有用的东西以使其最小化):

\documentclass{article}

\usepackage{xparse}

\providecommand*{\multiplefootnotemarker}{3sp}

\NewDocumentCommand \marker { } {%
\kern-\multiplefootnotemarker%
\kern\multiplefootnotemarker\relax%
}

\NewDocumentCommand \checker { } {%
\ifdim\lastkern=\multiplefootnotemarker\relax%
      \textsuperscript{,}%
\fi%
}

\NewDocumentCommand \fullcite { m } {%
#1%
}

\NewDocumentCommand \margincite { m } {%
\sidenote{\fullcite{#1}}%
}

\NewDocumentCommand \sidenote { m } {%
\sidenotemark%
\sidenotetext{#1}%
}

\NewDocumentCommand \sidenotemark { } {%
\checker%
\textsuperscript{1}%
\marker%
}

\NewDocumentCommand \sidenotetext { m } {%
\marginpar{#1}%
\marker
}

\begin{document}
1 Text\sidenote{one}\sidenote{two}

2 Text\sidenote{one}\margincite{two}

3 Text\sidenote{one}\sidenotemark

4 Text\sidenotemark text\sidenotetext{one}\sidenotemark

\end{document}

但是,这个解决方案是从footmisc包中借用的,有些人可能会称其为 hack。看下面的例子就很明显了:

\documentclass{book}

\usepackage[multiple]{footmisc}

\begin{document}
Text\footnotemark text\footnotetext{one}\footnotemark
\end{document}

这导致

脚杂

我之前的解决方案基于\ifnextchar\sidenoteClemens Niederberger 描述的构造

我不喜欢 sidenotes 包中的一些小问题(不是 bug),比如插入字距和多个标记的上标逗号。我更喜欢让我的 fnpct9 包处理这些事情

这让我重新审视了我的选择。此外,\ifnextchar必须插入每个添加的宏,例如,\margincite并且它不允许用户定义宏,包括旁注宏。

fnpct通过允许多个参数有一个解决方案:\sidenote{aaa;bbb}将打印两个注释。如果在游戏中放置参考资料,则它不会(很好地)工作。

\sidenote{aaa;\fullcite{citekey};ccc}

从用户的角度来看这似乎不正确。

这三种解决方案中哪一种是首选?还有其他方法可以可靠地检测后续宏吗?

答案1

最后一种情况下的虚假逗号是因为您\marker在“文本”命令中使用了没有设置上标标记的逗号,而它应该位于\sidenote(mark)

在此处输入图片描述

\documentclass{article}

\usepackage{xparse}

\providecommand*{\multiplefootnotemarker}{3sp}

\NewDocumentCommand \marker { } {%
\kern-\multiplefootnotemarker%
\kern\multiplefootnotemarker\relax%
}

\NewDocumentCommand \checker { } {%
\ifdim\lastkern=\multiplefootnotemarker\relax%
      \textsuperscript{,}%
\fi%
}

\NewDocumentCommand \fullcite { m } {%
#1%
}

\NewDocumentCommand \margincite { m } {%
\sidenote{\fullcite{#1}}%
}

\NewDocumentCommand \sidenote { m } {%
\sidenotemark%
\sidenotetext{#1}%
\marker%
}

\NewDocumentCommand \sidenotemark { } {%
\checker%
\textsuperscript{1}%
\marker%
}

\NewDocumentCommand \sidenotetext { m } {%
\marginpar{#1}%
}

\begin{document}
1 Text\sidenote{one}\sidenote{two}

2 Text\sidenote{one}\margincite{two}

3 Text\sidenote{one}\sidenotemark

4 Text\sidenotemark text\sidenotetext{one}\sidenotemark

\end{document}

相关内容