将变量从 LaTeX 传递到 bibtex(为了轻松匿名化)?

将变量从 LaTeX 传递到 bibtex(为了轻松匿名化)?

我通常在参考书目条目中使用变量来表示我的名字.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}

感谢大家的评论,我现在就看一下:)
干杯!

相关内容