![将变量从 LaTeX 传递到 bibtex(为了轻松匿名化)?](https://linux22.com/image/236879/%E5%B0%86%E5%8F%98%E9%87%8F%E4%BB%8E%20LaTeX%20%E4%BC%A0%E9%80%92%E5%88%B0%20bibtex%EF%BC%88%E4%B8%BA%E4%BA%86%E8%BD%BB%E6%9D%BE%E5%8C%BF%E5%90%8D%E5%8C%96%EF%BC%89%EF%BC%9F.png)
我通常在参考书目条目中使用变量来表示我的名字.bib
,例如:
@String {myname = "Prof. Dr. Hortensia Audactor"}
String {myname = "Anonymized" }
@article{audactor2005pflanzen,
title = {Wie Pflanzen hören... die Geheimnisse der Sonobotanik},
author = myname,
journal = {Draft: \url{http://www.inventionen.de/vortrag_audactor.html}},
year = {2005}
}
... 因为有些文章提交需要匿名。那么,原则上,我只需更改命令@
前面的at 符号String
,即可确定哪一个是活动的;因此,如果我想匿名,我只需确保使用类似下面的命令代替上述命令:
String {myname = "Prof. Dr. Hortensia Audactor"}
@String {myname = "Anonymized" }
但是,现在我遇到了一个问题,我必须处理两篇文章,这两篇文章都来自同一个 bibtex 文件并引用了相同的引文——其中一篇文章需要匿名化,而另一篇文章则不需要。这实际上意味着,如果.bib
我不想@
在每次编译一篇文章或另一篇文章时手动更改符号,那么现在我必须维护两个文件——一个带有匿名名称,另一个则不带匿名名称……当然,我发现这两种方法都很麻烦。
理想情况下,我想要做的是将一个选项传递给文件\bibliography
中的命令.tex
;假设需要匿名化的文章会“将一个变量传递”给 LaTeX 代码中的 bibtex,如下所示:
\bibliography[anon=yes]{mybibliography}
...然后,文件中会有一些代码.bib
,如果遇到anon=yes
,就会将设置@String {myname
为“匿名” - 否则,实际名称将保留(对于没有匿名要求的文章来说就是这种情况,它会在\bibliography
没有任何参数的情况下调用)。
那么,有什么想法可以证明我想要做的事情是可行的吗?(在“19 一些实用技巧”一节中驯服野兽有一些使用 的函数if$
,这让我认为我想要做的事情是可能的——不幸的是,我目前还不能确定是否是这种情况;编辑:那部分是针对.bst
文件的,所以不适用于这里;我不想弄乱.bst
,只.bib
)
答案1
您可以包括多个参考书目文件。
例如,您可以有两个(非常短的)Bibtex 文件:anon.bib
一个定义宏的匿名版本,myname.bib
另一个以通常的方式定义它。然后您就可以mybibliography.bib
处理其他所有内容了。
现在可以轻松使用
\bibliography{anon,mybibliography}
或者
\bibliography{myname,mybibliography}
根据您的需要,在您的 Latex 源中。无需编辑任何 *.bib 文件。
一个最小的工作示例。
书目:
@STRING{test = {Xxxx}}
y.bib:
@STRING{test = {Yyyy}}
书目编号:
@MISC{z,
author = test,
title = test,
year = {2000}
}
特克斯:
\documentclass[a4paper]{article}
\begin{document}
\cite{z}
\bibliographystyle{plain}
\bibliography{x,z}
\end{document}
豐特克斯:
\documentclass[a4paper]{article}
\begin{document}
\cite{z}
\bibliographystyle{plain}
\bibliography{y,z}
\end{document}
以下文件由 Bibtex 生成。
桶:
\begin{thebibliography}{1}
\bibitem{z}
Xxxx.
\newblock Xxxx, 2000.
\end{thebibliography}
桶:
\begin{thebibliography}{1}
\bibitem{z}
Yyyy.
\newblock Yyyy, 2000.
\end{thebibliography}
一般来说,包含多个 Bibtex 文件是一种强大的技术,您可以通过包含正确的 Bibtex 文件组合轻松控制 Bibtex 的行为。这是另一个例子。
答案2
最简单的方法是使用.bib
文件中的宏,例如\myname
,然后在 LaTeX 文件中定义它。您可能希望在文件的中使用\providecommand
宏,这样如果您忘记在 LaTeX 文件中定义它,也不会出现错误。@preamble
.bib
答案3
抱歉,还没有看到回复,但我想我已经让它运行起来了……
这是示例test.bib
文件:
------------- NEEDED MACRO
-------------
@preamble{ "\def\ConditionalName#1{\ifx\anonme\undefined#1\else\if\anonme1{Anonymized}\else#1\fi\fi}" }
------------- DEFINITION OF ANONYMIZED VARS/NAMES
-------------
@preamble{ "\def\myname{\ConditionalName{Prof. Dr. Hortensia Audactor}}" }
@String {myname = "\myname"}
------------- BIB ENTRIES
-------------
@article{audactor2005pflanzen,
title = {Wie Pflanzen hören... die Geheimnisse der Sonobotanik},
author = myname,
journal = {Draft: \url{http://www.inventionen.de/vortrag_audactor.html}},
year = {2005}
}
然后,这是test.tex
- 它应该显示原有的名称(并且没有什么特别的):
% test.tex
%
% build with:
% pdflatex test.tex
% bibtex test
% pdflatex test.tex
% pdflatex test.tex
\documentclass{article}
\usepackage{url}
\begin{document}
\section{Content}
Blah, blah, blah \cite{audactor2005pflanzen}; blah blah.
\bigskip
% no anonymization here
\bibliographystyle{plain}
\bibliography{test}
\end{document}
...最后,这里是testanon.tex
:
% testanon.tex
%
% build with:
% pdflatex testanon.tex
% bibtex testanon
% pdflatex testanon.tex
% pdflatex testanon.tex
\documentclass{article}
\usepackage{url}
\begin{document}
\section{Content}
Blah, blah, blah \cite{audactor2005pflanzen}; blah blah.
\bigskip
\def\anonme{1}
\bibliographystyle{plain}
\bibliography{test}
\end{document}
...\def\anonme{1}
用作应进行匿名化的“信号”。
仅供个人参考,这是我用于测试的.tex 文件:
% macrotest.tex
\documentclass{minimal}
\begin{document}
% via \newcommand:
\newcommand\ConditionalName[1]{
\ifx\anonme\undefined%
#1%
\else%
\if\anonme1%
{Anonymized}%
\else%
#1%
\fi%
\fi%
}
% via \def, in single line (handles punctuation better)
% \def\ConditionalName#1{\ifx\anonme\undefined#1\else\if\anonme1{Anonymized}\else#1\fi\fi}
Test of \verb!\ConditionalName!: \ConditionalName{John A}, then def (\def\anonme{1}), then again: \ConditionalName{John B}, then def 0 (\def\anonme{0}), then again: \ConditionalName{John C} .. then undef (\makeatletter\let\anonme\@undefined\makeatother), then again: \ConditionalName{John D} .. then def (\def\anonme{1}), then again: \ConditionalName{John E}.
\end{document}
感谢大家的评论,我现在就看一下:)
干杯!