![使用 memoize 时启用对 Biblatex 的自动支持](https://linux22.com/image/473011/%E4%BD%BF%E7%94%A8%20memoize%20%E6%97%B6%E5%90%AF%E7%94%A8%E5%AF%B9%20Biblatex%20%E7%9A%84%E8%87%AA%E5%8A%A8%E6%94%AF%E6%8C%81.png)
请注意,该问题涉及memoize
版本 1.1.2(2024-01-21)以及更高版本。
memoize
\cite
版本 1.1.2 提供使用 Biblatex 时自动处理和记忆代码的内置支持\cites
。我正尝试使用它来支持更广泛的 Biblatex 引用宏。
到目前为止,我已经使用内置cite
和cites
样式运行了许多这样的宏。例如,他的支持\autocite
auto=\autocite{cite},
cite field
我通过定义使用自定义的样式完成了更多部分工作outer handler
。
auto/cite field/.style={run if memoizing, args=oomom, outer handler=\mmz@auto@citefield},
例如,
auto csname={citefield}{cite field},
auto csname={citelist}{cite field},
auto csname={citename}{cite field},
和outer handler
\NewDocumentCommand \mmz@auto@citefield { O{} O{} m O{} m}
{% purloined from memoize.sty & mangled
\xtoksapp\mmzCCMemo{%
\noexpand\nocite{#3}%
}%
\AdviceOriginal[#1][#2]{#3}[#4]{#5}%
}
但是,上下文敏感功能无法正常工作,因此我需要
auto csname={abx@missing}{abort},
如果引用命令的输出发生变化,则不会自动生成任何内容。
最好的定义方法是什么\mmz@auto@citefield
?
梅威瑟:
\documentclass{article}
\usepackage{memoize}
\usepackage{biblatex}
\bibliography{biblatex-examples}
\usepackage{tikz}
\makeatletter
\mmzset{%
prefix=memos/,
begindocument/before/.append style={%
auto=\autocite{cite},
auto csname={abx@missing}{abort},
auto/cite field/.style={run if memoizing, args=oomom, outer handler=\mmz@auto@citefield},
auto csname={citefield}{cite field},
auto csname={citelist}{cite field},
auto csname={citename}{cite field},
},
}
\NewDocumentCommand \mmz@auto@citefield { O{} O{} m O{} m}
{% purloined from memoize.sty & mangled
\xtoksapp\mmzCCMemo{%
\noexpand\nocite{#3}%
}%
\AdviceOriginal[#1][#2]{#3}[#4]{#5}%
}
\makeatother
\begin{document}
\begin{tikzpicture}
\node [draw] {\autocite{westfahl:space}};
\end{tikzpicture}
\begin{tikzpicture}
\node [draw] {\citefield{westfahl:space}{booktitle}};
\end{tikzpicture}
\begin{tikzpicture}
\node [draw] {\citename{westfahl:space}{author}};
\end{tikzpicture}
\begin{tikzpicture}
\node [draw] {\citelist{westfahl:space}{location}};
\end{tikzpicture}
\printbibliography
\end{document}
答案1
该问题是由于一个错误引起的,已通过更新至 1.2 版本进行修复。