我想检测后续的宏,以便插入上标数字。如果两个宏彼此相连,则应在它们之间插入逗号。
最小示例(删除了有用的东西以使其最小化):
\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\sidenote
Clemens 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}