
私は\citeall
カスタム エントリ フォーマッタを使用して bib ファイル内のすべてのエントリをリストしていますが、特定のジャーナルのエントリを条件付きでフォーマットしたいと考えています。これを行うには、 を使用して\ifthenelse
の結果と文字列を比較しようとしました\citefield{key}{journaltitle}
が、うまくいきません。スニペット:
\newcommand{\completecite}[1]{%
\ifstrequal{\citefield{#1}{journaltitle}}{CoRR}{TRUE}{FALSE}
}
\citeall[\completecite]
すべてのエントリに対して「FALSE」を吐き出しますが、
\newcommand{\completecite}[1]{%
\citefield{#1}{journaltitle}
}
\citeall[\completecite]
出力には「CoRR」が多くあります。問題は、文字列が\citefield{#1}{journaltitle}
「CoRR」と比較されていることです。私が比較したいのは、\citefield
マクロを呼び出した結果。
\expandafter
やその他さまざまな複雑な文字列比較の例を試してみましたが、まだ何も機能していません。 xstring
、パッケージxifthen
もいじってみましたpdftexcmds
。etoolbox\ifdefstring
の
\newcommand{\completecite}[1]{%
\ifdefstring{\citefield{#1}{journaltitle}}{CoRR}{TRUE}{FALSE}
}
\citeall[\completecite]
動作しませんでした。
答え1
次の質問で発生した問題と同様の問題に直面しています:なぜ \ifx は \MakeUppercase{1} と \MakeLowercase{1} を異なるものとみなすのでしょうか?
\citefield
はフィールドの内容を印刷するコマンドであり、テキストを返す関数ではありません (TeX の言語はマクロ展開に基づいているため、実際には関数自体は存在せず、これはまったく別の問題です)。
BibLaTeX の内部構造に詳しい人なら、意味のある方法でジャーナル タイトルを抽出する方法を見つけられるかもしれません (また、最終目標をより明確にできる場合は、必要なことを実行する事前ロール済みのものがあるのではないかと思います)。
答え2
これは、\citeによって返された引用に文字列置換を適用します。
としてドン・ホーセック説明彼の答えのコマンドbiblatex
は\...cite...
タイプセット用であり、タイプセット可能なテキスト自体に展開したり返したりはしません。つまり、通常の TeX ツールでは、\...cite...
コマンドによって生成された出力の一部を単純なテキストと比較したり置き換えたりすることはできません。
でフィールドの内容を比較することは可能ですbiblatex
が、それは「コンテキスト」にいる間に、別のレベルで実行する必要がありますbiblatex
。引用や参考文献の出力に影響を与えたい場合は、いずれにしてもそのコンテキストで作業する必要があるため、通常、これは問題にはなりません。
以下は を使用した非常に簡単な例です\iffieldequalstr
。 を使用してコンテキスト\AtEveryBibitem
にフックしますbiblatex
。通常、変更する bibmacro では次のようなテストを使用します。
\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[style=authoryear, backend=biber]{biblatex}
\AtEveryBibitem{%
\iffieldequalstr{journaltitle}{CoRR}
{T}
{F}}
\begin{filecontents}{\jobname.bib}
@article{appleby,
author = {Humphrey Appleby},
title = {On the Importance of the Civil Service},
journal = {CoRR},
date = {1980},
}
\end{filecontents}
\addbibresource{\jobname.bib}
\addbibresource{biblatex-examples.bib}
\begin{document}
\cite{sigfridsson,appleby}
\printbibliography
\end{document}
特定のフィールドでの文字列比較 (これは常に少し難しい) よりも、特定のエントリのクラスをより適切に検出する方法が他にもある可能性があります。探しているプロパティが既存のデータから簡単に特定できない場合は、新しいオプションを定義したり、キーワードを明示的に設定したりするのが一般的です。
arXiv CoRR(出典:) であれば、arXiv 自体と同様に、CoRR は実際にはジャーナルではないと主張します。そのようなエントリには、@online
(cf.Biblatex の参考文献エントリのジャーナル タイトル フィールドのない @article の形式)。