From 5f80d92d8bebc775b30e2b212e33b08089517654 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 28 Mar 2022 03:02:13 +0000 Subject: CTAN sync 202203280302 --- biblio/bibtex/contrib/jieeetran/README | 20 + biblio/bibtex/contrib/jieeetran/jIEEEtran.bst | 3192 ++++++++++++++++++++++ biblio/bibtex/contrib/jieeetran/jieeetran-en.pdf | Bin 0 -> 30028 bytes biblio/bibtex/contrib/jieeetran/jieeetran-en.tex | 86 + biblio/bibtex/contrib/jieeetran/jieeetran.pdf | Bin 0 -> 116572 bytes biblio/bibtex/contrib/jieeetran/jieeetran.tex | 376 +++ biblio/bibtex/contrib/jieeetran/mixej.py | 486 ++++ 7 files changed, 4160 insertions(+) create mode 100644 biblio/bibtex/contrib/jieeetran/README create mode 100644 biblio/bibtex/contrib/jieeetran/jIEEEtran.bst create mode 100644 biblio/bibtex/contrib/jieeetran/jieeetran-en.pdf create mode 100644 biblio/bibtex/contrib/jieeetran/jieeetran-en.tex create mode 100644 biblio/bibtex/contrib/jieeetran/jieeetran.pdf create mode 100644 biblio/bibtex/contrib/jieeetran/jieeetran.tex create mode 100644 biblio/bibtex/contrib/jieeetran/mixej.py (limited to 'biblio/bibtex/contrib/jieeetran') diff --git a/biblio/bibtex/contrib/jieeetran/README b/biblio/bibtex/contrib/jieeetran/README new file mode 100644 index 0000000000..b336ef5145 --- /dev/null +++ b/biblio/bibtex/contrib/jieeetran/README @@ -0,0 +1,20 @@ +March 26, 2021 + + +jIEEEtran is an UNOFFICIAL BibTeX style for authors trying to cite Japanese +articles in the Institute of Electrical and Electronics Engineers (IEEE) format. +jIEEEtran is an expansion package of Michael Shell's IEEEtran package. +The latest version of the jIEEEtran package can be found at CTAN: + +http://www.ctan.org/pkg/jieeetran + +Problems, requests, tips, beta releases, and other support, can be seen +in jIEEEtran's GitHub page: + +https://github.com/ehki/jIEEEtran + +jIEEEtran may be distributed and/or modified under the terms of MIT license. + +Best wishes for all your publication endeavors, + +Haruki Ejiri diff --git a/biblio/bibtex/contrib/jieeetran/jIEEEtran.bst b/biblio/bibtex/contrib/jieeetran/jIEEEtran.bst new file mode 100644 index 0000000000..1e2a025c5d --- /dev/null +++ b/biblio/bibtex/contrib/jieeetran/jIEEEtran.bst @@ -0,0 +1,3192 @@ +%% +%% jIEEEtran.bst +%% BibTeX Bibliography Style file for IEEE Journals and Conferences (unsorted) for Japanese users +%% +%% Version 0.18 (2022/03/26) +%% +%% Copyright (c) 2020-2022 Haruki Ejiri and Yoshi Ri +%% +%% Original starting code base and algorithms obtained from the output of +%% Patrick W. Daly's makebst package as well as from prior versions of +%% IEEE BibTeX styles: +%% +%% 1. Howard Trickey and Oren Patashnik's ieeetr.bst (1985/1988) +%% 2. Silvano Balemi and Richard H. Roy's IEEEbib.bst (1993) +%% 3. Michael Shell's IEEEtran.bst (2003-2015) +%% +%% Support sites: +%% http://www.michaelshell.org/tex/ieeetran/ +%% http://www.ctan.org/pkg/ieeetran +%% and/or +%% http://www.ieee.org/ +%% and/or +%% https://github.com/ehki/jIEEEtran/ +%% +%% For use with pbibtex version 0.99d-j0.33 or later +%% +%% This is a numerical citation style. +%% +%%************************************************************************* +%% Legal Notice: +%% This code is offered as-is without any warranty either expressed or +%% implied; without even the implied warranty of MERCHANTABILITY or +%% FITNESS FOR A PARTICULAR PURPOSE! +%% User assumes all risk. +%% In no event shall the IEEE/IEEJ or any contributor to this code be liable for +%% any damages or losses, including, but not limited to, incidental, +%% consequential, or any other damages, resulting from the use or misuse +%% of any information contained here. +%% +%% All comments are the opinions of their respective authors and are not +%% necessarily endorsed by the IEEE/IEEJ. +%% +%% The original version of this code, i.e. IEEEtran.bst by, Michael Shell +%% was distributed under the LaTeX Project Public License (LPPL) +%% ( http://www.latex-project.org/ ) version 1.3, and may be freely used, +%% distributed and modified. A copy of the LPPL, version 1.3, is included +%% in the base LaTeX documentation of all distributions of LaTeX released +%% 2003/12/01 or later. +%% Retain all contribution notices and credits. +%% ** Modified files should be clearly indicated as such, including ** +%% ** renaming them and changing author support contact information. ** +%%************************************************************************* +%% +%% 日本人の電気系LaTeXユーザのためのBibTeXスタイルファイルです。本ファイル +%% はIEEE形式での引用スタイルで、オプションを変更することで電気学会形式へ +%% と変更することが可能です。 +%% 電気学会形式のIEEJtran.bst/IEEE形式のjIEEEtran.bstともに非公式です。 +%% ファイルの破損、データの損失、本コードを使用したことによるリジェクトなど +%% いかなる問題が生じた場合でも作者らは責任を負うことができません。 +%% コードはGitHub上で開発していますので、問題がありましたらIssueを立て、 +%% コミットをし、プルリクエストを投げてくださると嬉しいです。 +%% + + + +% +% Terminalに表示されるログメッセージのファイル名やURLの設定 +% + +FUNCTION{bst.file.name} { "jIEEEtran.bst" } +FUNCTION{bst.file.version} { "0.18" } +FUNCTION{bst.file.date} { "2022/03/26" } +FUNCTION{bst.file.website} { "https://github.com/ehki/jIEEEtran/" } +FUNCTION{bst.file.author} { "Haruki Ejiri and Yoshi Ri" } + + +%% オプション & 設定 + +% 電気学会形式の引用フォーマットを使用するかの設定 +% #0 : IEEEフォーマットで引用する。 +% 日本語が含まれるエントリでは、日本語の不自然な扱いを解消する。 +% 日本語が含まれないエントリでは、Languageフィールドの取り扱いを除き +% オリジナルのIEEEtran.bst通りの出力となる。 +% #1 : 電気学会フォーマットで引用する。 +% 日本語が含まれるエントリも、日本語が含まれないエントリも、 +% 全ての文献に電気学会形式に合わせて引用する。 +FUNCTION {use.ieej.setting} { #0 } + + +% 電気学会形式の場合に短縮表記をするかどうかの設定 +% #0 : 短縮しない +% #1 : 短縮する +FUNCTION {default.use.ieej.abbrev} { #0 } + + +% 電気学会形式の発行年の指定 +% default: {bbl.ieej.jp.year.pre} { "(" } +% {bbl.ieej.jp.year.aft} { ")" } +% {bbl.ieej.en.year.pre} { "(" } +% {bbl.ieej.en.year.aft} { ")" } +FUNCTION {bbl.ieej.jp.year.pre} { "(" } +FUNCTION {bbl.ieej.jp.year.aft} { ")" } +FUNCTION {bbl.ieej.en.year.pre} { "(" } +FUNCTION {bbl.ieej.en.year.aft} { ")" } + + +% 電気学会形式において、発行年の前にカンマを打つかの指定 +% #0 : 打たない +% #1 : 打つ +% default: { #0 } +FUNCTION {ieej.setting.comma.year.pre} { #0 } + + +% 電気学会形式において、発行年の後にピリオドを打つかの指定 +% #0 : 打たない +% #1 : 打つ +% default: { #0 } +FUNCTION {ieej.setting.punct.year.aft} { #0 } + + +% 電気学会形式において、英語の書籍名と雑誌名をemphasizeするかの指定 +% #0 : emphasize しない +% #1 : emphasize する +% default: {ieej.en.setting.emph.journal} { #1 } +% : {ieej.en.setting.emph.booktitle} { #0 } +FUNCTION {ieej.en.setting.emph.journal} { #1 } +FUNCTION {ieej.en.setting.emph.booktitle} { #0 } + + +% 電気学会形式において、日本語の書籍名と雑誌名をemphasizeするかの指定 +% #0 : emphasize しない +% #1 : emphasize する +% default: {ieej.jp.setting.emph.journal} { #0 } +% : {ieej.jp.setting.emph.booktitle} { #0 } +FUNCTION {ieej.jp.setting.emph.journal} { #0 } +FUNCTION {ieej.jp.setting.emph.booktitle} { #0 } + + +% IEEE形式において、日本語の書籍名と雑誌名をemphasizeするかの指定 +% #0 : emphasize しない +% #1 : emphasize する +% default: { #0 } +FUNCTION {ieee.jp.setting.emph.title} { #0 } + + +% 電気学会形式において、タイトル前後の文字を指定 +% default: {bbl.ieej.jp.title.pre} { "「" } +% {bbl.ieej.jp.title.aft} { "」" } +% {bbl.ieej.en.title.pre} { "``" } +% {bbl.ieej.en.title.aft} { "''" } +FUNCTION {bbl.ieej.jp.title.pre} { "「" } +FUNCTION {bbl.ieej.jp.title.aft} { "」" } +FUNCTION {bbl.ieej.en.title.pre} { "``" } +FUNCTION {bbl.ieej.en.title.aft} { "''" } + + +% 電気学会形式形式において、著者とタイトルの間の文字の指定 +% default: {bbl.ieej.jp.author.title.sep.F} { ":" } +% {bbl.ieej.en.author.title.sep.F} { ":" } +% {bbl.ieej.jp.author.title.sep.A} { "," } +% {bbl.ieej.en.author.title.sep.A} { "," } +FUNCTION {bbl.ieej.jp.author.title.sep.F} { ":" } +FUNCTION {bbl.ieej.en.author.title.sep.F} { ":" } +FUNCTION {bbl.ieej.jp.author.title.sep.A} { "," } +FUNCTION {bbl.ieej.en.author.title.sep.A} { "," } + + +% 日本語文献において、vol. の表記法の設定 +% .Fは非省略表記、.Aは省略表記 +% default: {bbl.ieej.vol.F} { "Vol." } +% {bbl.ieej.vol.A} { "\textbf{" } +FUNCTION {bbl.ieej.vol.F} { "Vol." } +FUNCTION {bbl.ieej.vol.A} { "\textbf{" } + + +% 日本語文献において、vol. を記載した後、 +% カンマの前に記載する文字列の指定 +% .Fは非省略表記、.Aは省略表記 +% default: {bbl.ieej.vol.aft.F} { "" } +% {bbl.ieej.vol.aft.A} { "}" } +FUNCTION {bbl.ieej.vol.aft.F} { "" } +FUNCTION {bbl.ieej.vol.aft.A} { "}" } + + +% 日本語文献において、no. の表記法の設定 +% .Fは非省略表記、.Aは省略表記 +% default: {bbl.ieej.no.F} { "No." } +% {bbl.ieej.no.A} { "(" } +FUNCTION {bbl.ieej.no.F} { "No." } +FUNCTION {bbl.ieej.no.A} { "(" } + + +% 日本語文献において、no. を記載した後、 +% カンマの前に記載する文字列の指定 +% .Fは非省略表記、.Aは省略表記 +% default: {bbl.ieej.no.aft.F} { "" } +% {bbl.ieej.no.aft.A} { ")" } +FUNCTION {bbl.ieej.no.aft.F} { "" } +FUNCTION {bbl.ieej.no.aft.A} { ")" } + + +% 日本語文献における、pp. の表記法の設定。 +% .Fは非省略表記、.Aは省略表記 +% default: {bbl.ieej.pages.F} { "pp." } +% {bbl.ieej.pages.A} { "" } +FUNCTION {bbl.ieej.pages.F} { "pp." } +FUNCTION {bbl.ieej.pages.A} { "" } + + +% 日本語文献における、p. の表記法の設定。 +% .Fは非省略表記、.Aは省略表記 +% default: {bbl.ieej.page.F} { "p." } +% {bbl.ieej.page.A} { "" } +FUNCTION {bbl.ieej.page.F} { "p." } +FUNCTION {bbl.ieej.page.A} { "" } + + +% 日本語と英語の etal の表記の設定 +% default: {bbl.etal.jp} { "他" } +% {bbl.etal.en} { "et~al." } +FUNCTION {bbl.etal.jp} { "他" } +FUNCTION {bbl.etal.en} { "et~al." } + + +% 電気学会形式において、日本語/英語文献の章番号前後文字、チルダ(~)を使用するかの設定 +% default: {bbl.ieej.jp.chapter.pre} { "第" } +% {bbl.ieej.jp.chapter.aft} { "章" } +% {bbl.ieej.jp.chapter.tie.pre} { #0 } +% {bbl.ieej.jp.chapter.tie.aft} { #0 } +% {bbl.ieej.en.chapter.pre} { "Chap." } +% {bbl.ieej.en.chapter.aft} { "" } +% {bbl.ieej.en.chapter.tie.pre} { #0 } +% {bbl.ieej.en.chapter.tie.aft} { #0 } +FUNCTION {bbl.ieej.jp.chapter.pre} { "第" } +FUNCTION {bbl.ieej.jp.chapter.aft} { "章" } +FUNCTION {bbl.ieej.jp.chapter.tie.pre} { #0 } % 章番号前文字と章番号の間にチルダを挿入しない +FUNCTION {bbl.ieej.jp.chapter.tie.aft} { #0 } % 章番号と章番号後文字との間にチルダを挿入しない +FUNCTION {bbl.ieej.en.chapter.pre} { "Chap." } +FUNCTION {bbl.ieej.en.chapter.aft} { "" } +FUNCTION {bbl.ieej.en.chapter.tie.pre} { #0 } % 章番号前文字と章番号の間にチルダを挿入する +FUNCTION {bbl.ieej.en.chapter.tie.aft} { #0 } % 章番号と章番号後文字との間にチルダを挿入しない + + +% 日本語文献において、著者間の仕切り文字の設定 +% default: {bbl.ieej.jp.author.sep} { "・" } +% {bbl.ieej.en.author.sep} { ", " } +FUNCTION {bbl.ieej.jp.author.sep} { "・" } +FUNCTION {bbl.ieej.en.author.sep} { ", " } + + +% 電気学会形式において、発行年と発行月の区切り文字の指定 +% default: { "-" } +FUNCTION {bbl.ieej.year.month.sep} { "-" } + + +% 電気学会形式において、発行月の表示形式の指定 +% #0 : "1", "2", ..., "12" のように数字で表示 +% #1 : "Jan", "Feb.", ..., "Dec." のようにアルファベットで表示 +% default: { #0 } +FUNCTION {format.month.ieej} { #0 } + + +% IEEE形式において、発行月の表示形式の指定 +% #0 : "1", "2", ..., "12" のように数字で表示 +% #1 : "Jan", "Feb.", ..., "Dec." のようにアルファベットで表示 +% default: { #1 } +FUNCTION {format.month.ieee} { #1 } + + +% 電気学会形式において、 +% 「手法Aと手法B、どちらが正しいのか?」 +% "Method A and B - Which is correct?" +% のように、?や.など文区切り文字がタイトル最後にきた場合でも +% 「手法Aと手法B、どちらが正しいのか?」,学会名 +% "Method A and B - Which is correct?", Journal title +% のように"の後にカンマを打つかの設定 +% #0: カンマを打たない, #1: カンマを打つ +% default: { #1 } +FUNCTION { bbl.ieej.force.punct.aft.quote } { #1 } + + +% languageにJapaneseやFrenchの指定がある場合に +% (in Language)を表記するかの設定 +% #0 言語表記しない +% #1 IEEE-Reference-Guideの通りに言語表記する +% https://ieeeauthorcenter.ieee.org/wp-content/uploads/IEEE-Reference-Guide.pdf +% #2 文献末尾に言語表記する +% default : {bbl.format.language.ieej} { #2 } +% {bbl.format.language.ieee} { #1 } +FUNCTION {bbl.format.language.ieej} { #2 } +FUNCTION {bbl.format.language.ieee} { #1 } +FUNCTION {bbl.format.language} +{ use.ieej.setting #1 = + { bbl.format.language.ieej } + { bbl.format.language.ieee } + if$ +} + + +% language表記の後にピリオドを打つかの設定 +% default : { #1 } % for jIEEEtran.bst (デフォルト通りで強制しない) +% { #0 } % for IEEJtran.bst (ピリオドを強制的に打たせない) +FUNCTION {bbl.format.language.punct.ieej} { #0 } +FUNCTION {bbl.format.language.punct.ieee} { #1 } +FUNCTION {bbl.format.language.punct} +{ use.ieej.setting #1 = + { bbl.format.language.punct.ieej } + { bbl.format.language.punct.ieee } + if$ +} + + +% select.language関数を用いてタイトルジャーナル名に +% \BIBforeignlanguage{Japanese} +% などのhyphenation設定の処理を行うかの設定。 +% { #1 } : hyphenation設定を行う(設定していないとWARNINGが出る。 +% { #0 } : hyphenation設定を行わない +% default : { #0 } +FUNCTION {bbl.use.select.language} { #0 } + + +% URLの表記をするかどうかの設定 +% default : {default.is.use.url.ieej} {#0} 電気学会形式ではURLを書かない +% {default.is.use.url.ieee} {#1} IEEE形式ではURLがあれば書く +FUNCTION {default.is.use.url.ieej} {#0} +FUNCTION {default.is.use.url.ieee} {#1} + + +% 同一著者の文献が連続した場合に著者名を長ダッシュで代用するかの設定 +% 電気学会形式では長ダッシュで代用はしない +% IEEE形式では長ダッシュで代用する +% default : { default.is.dash.repeated.names.ieej } { #0 } +% { default.is.dash.repeated.names.ieee } { #1 } +FUNCTION { default.is.dash.repeated.names.ieej } { #0 } +FUNCTION { default.is.dash.repeated.names.ieee } { #1 } + + +% IEEEtran.bstに元からあるオプション群 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% DEFAULTS FOR THE CONTROLS OF THE BST STYLE %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% These are the defaults for the user adjustable controls. The values used +% here can be overridden by the user via IEEEtranBSTCTL entry type. + +% NOTE: The recommended LaTeX command to invoke a control entry type is: +% +%\makeatletter +%\def\bstctlcite{\@ifnextchar[{\@bstctlcite}{\@bstctlcite[@auxout]}} +%\def\@bstctlcite[#1]#2{\@bsphack +% \@for\@citeb:=#2\do{% +% \edef\@citeb{\expandafter\@firstofone\@citeb}% +% \if@filesw\immediate\write\csname #1\endcsname{\string\citation{\@citeb}}\fi}% +% \@esphack} +%\makeatother +% +% It is called at the start of the document, before the first \cite, like: +% \bstctlcite{IEEEexample:BSTcontrol} +% +% IEEEtran.cls V1.6 and later does provide this command. + + +% #0 turns off the display of the number for articles. +% #1 enables +FUNCTION {default.is.use.number.for.article} { #1 } + + +% #0 turns off the display of the paper and type fields in @inproceedings. +% #1 enables +FUNCTION {default.is.use.paper} { #1 } + + +% #0 turns off the display of urls +% #1 enables +FUNCTION {default.is.use.url} +{ use.ieej.setting #1 = + { default.is.use.url.ieej } + { default.is.use.url.ieee } + if$ +} + + +% #0 turns off the forced use of "et al." +% #1 enables +FUNCTION {default.is.forced.et.al} +{ % Note: "and" function is not declared yet + use.ieej.setting #1 = + { default.use.ieej.abbrev #1 = + { #1 } + { #0 } + if$ + } + { #0 } + if$ +} + + +% The maximum number of names that can be present beyond which an "et al." +% usage is forced. Be sure that num.names.shown.with.forced.et.al (below) +% is not greater than this value! +% Note: There are many instances of references in IEEE journals which have +% a very large number of authors as well as instances in which "et al." is +% used profusely. +FUNCTION {default.max.num.names.before.forced.et.al} +{ % Note: "and" function is not declared yet + use.ieej.setting #1 = + { default.use.ieej.abbrev #1 = + { #2 } % two authors are shown without et al. + { #10 } + if$ + } + { #10 } + if$ +} + + +% The number of names that will be shown with a forced "et al.". +% Must be less than or equal to max.num.names.before.forced.et.al +FUNCTION {default.num.names.shown.with.forced.et.al} { #1 } + + +% #0 turns off the alternate interword spacing for entries with URLs. +% #1 enables +FUNCTION {default.is.use.alt.interword.spacing} { #1 } + + +% If alternate interword spacing for entries with URLs is enabled, this is +% the interword spacing stretch factor that will be used. For example, the +% default "4" here means that the interword spacing in entries with URLs can +% stretch to four times normal. Does not have to be an integer. Note that +% the value specified here can be overridden by the user in their LaTeX +% code via a command such as: +% "\providecommand\BIBentryALTinterwordstretchfactor{1.5}" in addition to +% that via the IEEEtranBSTCTL entry type. +FUNCTION {default.ALTinterwordstretchfactor} { "4" } + + +% #0 turns off the "dashification" of repeated (i.e., identical to those +% of the previous entry) names. The IEEE normally does this. +% #1 enables +FUNCTION {default.is.dash.repeated.names} { + use.ieej.setting #1 = + { default.is.dash.repeated.names.ieej } + { default.is.dash.repeated.names.ieee } + if$ +} + + +% The default name format control string. %change based on japanese +FUNCTION {default.name.format.en.string}{ "{f.~}{vv~}{ll}{, jj}" } +FUNCTION {default.name.format.jp.string}{ "{ff}~{vv~}{ll}{, jj}" } + + +% The default LaTeX font command for the names. +FUNCTION {default.name.latex.cmd}{ "" } + + +% The default URL prefix. +FUNCTION {default.name.url.prefix}{ "[Online]. Available:" } + + +% Other controls that cannot be accessed via IEEEtranBSTCTL entry type. + +% #0 turns off the terminal startup banner/completed message so as to +% operate more quietly. +% #1 enables +FUNCTION {is.print.banners.to.terminal} { #1 } + + + + +%%%%%%%%%%%% +%% BANNER %% +%%%%%%%%%%%% + +FUNCTION {banner.message} +{ is.print.banners.to.terminal + { "-- " bst.file.name * " " * bst.file.version * + " (" * bst.file.date * ") " * "by " * bst.file.author * "." * + top$ + "-- " bst.file.website * + top$ + "-- See the " quote$ * "IEEEtran_bst_HOWTO.pdf" * quote$ * + " manual for usage information for IEEEtran.bst." * + top$ + "-- See also " quote$ * "howtouse.pdf" * quote$ * + " manual for usase information for jIEEEtran.bst and IEEJtran.bst." * + top$ + } + { skip$ } + if$ +} + +FUNCTION {completed.message} +{ is.print.banners.to.terminal + { "" + top$ + "Done." + top$ + } + { skip$ } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%% +%% STRING CONSTANTS %% +%%%%%%%%%%%%%%%%%%%%%% +FUNCTION {bbl.a}{ "A" } +FUNCTION {bbl.an}{ "An" } +FUNCTION {bbl.and}{ "and" } +%FUNCTION {bbl.etal}{ "et~al." } +FUNCTION {bbl.editors}{ "eds." } +FUNCTION {bbl.editor}{ "ed." } +FUNCTION {bbl.edition}{ "ed." } +FUNCTION {bbl.volume}{ "vol." } +FUNCTION {bbl.of}{ "of" } +FUNCTION {bbl.number}{ "no." } +FUNCTION {bbl.in}{ "in" } +FUNCTION {bbl.pages}{ "pp." } +FUNCTION {bbl.page}{ "p." } +FUNCTION {bbl.chapter}{ "ch." } +FUNCTION {bbl.paper}{ "paper" } +FUNCTION {bbl.part}{ "pt." } +FUNCTION {bbl.patent}{ "Patent" } +FUNCTION {bbl.patentUS}{ "U.S." } +FUNCTION {bbl.revision}{ "Rev." } +FUNCTION {bbl.series}{ "ser." } +FUNCTION {bbl.standard}{ "Std." } +FUNCTION {bbl.techrep}{ "Tech. Rep." } +FUNCTION {bbl.the}{ "The" } +FUNCTION {bbl.mthesis}{ "Master's thesis" } +FUNCTION {bbl.phdthesis}{ "Ph.D. dissertation" } +FUNCTION {bbl.st}{ "st" } +FUNCTION {bbl.nd}{ "nd" } +FUNCTION {bbl.rd}{ "rd" } +FUNCTION {bbl.th}{ "th" } + + +% This is the LaTeX spacer that is used when a larger than normal space +% is called for (such as just before the address:publisher). +FUNCTION {large.space} { "\hskip 1em plus 0.5em minus 0.4em\relax " } + +% The LaTeX code for dashes that are used to represent repeated names. +% Note: Some older IEEE journals used something like +% "\rule{0.275in}{0.5pt}\," which is fairly thick and runs right along +% the baseline. However, the IEEE now uses a thinner, above baseline, +% six dash long sequence. +FUNCTION {repeated.name.dashes} { "------" } + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% PREDEFINED STRING MACROS %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +MACRO {jan} {"Jan."} +MACRO {feb} {"Feb."} +MACRO {mar} {"Mar."} +MACRO {apr} {"Apr."} +MACRO {may} {"May"} +MACRO {jun} {"Jun."} +MACRO {jul} {"Jul."} +MACRO {aug} {"Aug."} +MACRO {sep} {"Sep."} +MACRO {oct} {"Oct."} +MACRO {nov} {"Nov."} +MACRO {dec} {"Dec."} + + + +%%%%%%%%%%%%%%%%%% +%% ENTRY FIELDS %% +%%%%%%%%%%%%%%%%%% + +ENTRY + { address + assignee + author + booktitle + chapter + day + dayfiled + edition + editor + howpublished + institution + intype + journal + key + language + month + monthfiled + nationality + note + number + organization + pages + paper + publisher + school + series + revision + title + type + url + volume + year + yearfiled + CTLuse_article_number + CTLuse_paper + CTLuse_url + CTLuse_forced_etal + CTLmax_names_forced_etal + CTLnames_show_etal + CTLuse_alt_spacing + CTLalt_stretch_factor + CTLdash_repeated_names + CTLname_format_string + CTLname_latex_cmd + CTLname_url_prefix + CTLuse_ieej_abbrev + } + {} + { label } + + + + +%%%%%%%%%%%%%%%%%%%%%%% +%% INTEGER VARIABLES %% +%%%%%%%%%%%%%%%%%%%%%%% + +INTEGERS { prev.status.punct this.status.punct punct.std + punct.no punct.comma punct.period + prev.status.space this.status.space space.std + space.no space.normal space.large + prev.status.quote this.status.quote quote.std + quote.no quote.close + prev.status.nline this.status.nline nline.std + nline.no nline.newblock + status.cap cap.std + cap.no cap.yes + japanese.flag} + +INTEGERS { longest.label.width multiresult nameptr namesleft number.label numnames } + +INTEGERS { is.use.number.for.article + is.use.paper + is.use.url + is.forced.et.al + max.num.names.before.forced.et.al + num.names.shown.with.forced.et.al + is.use.alt.interword.spacing + is.dash.repeated.names + use.ieej.abbrev} + + +%%%%%%%%%%%%%%%%%%%%%% +%% STRING VARIABLES %% +%%%%%%%%%%%%%%%%%%%%%% + +STRINGS { bibinfo + longest.label + oldname + s + t + ALTinterwordstretchfactor + name.format.string + name.latex.cmd + name.url.prefix} + + + + +%%%%%%%%%%%%%%%%%%%%%%%%% +%% LOW LEVEL FUNCTIONS %% +%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {initialize.controls} +{ default.is.use.number.for.article 'is.use.number.for.article := + default.is.use.paper 'is.use.paper := + default.is.use.url 'is.use.url := + default.is.forced.et.al 'is.forced.et.al := + default.max.num.names.before.forced.et.al 'max.num.names.before.forced.et.al := + default.num.names.shown.with.forced.et.al 'num.names.shown.with.forced.et.al := + default.is.use.alt.interword.spacing 'is.use.alt.interword.spacing := + default.is.dash.repeated.names 'is.dash.repeated.names := + default.ALTinterwordstretchfactor 'ALTinterwordstretchfactor := + default.name.format.en.string 'name.format.string := + default.name.latex.cmd 'name.latex.cmd := + default.name.url.prefix 'name.url.prefix := + default.use.ieej.abbrev 'use.ieej.abbrev := +} + + +% This IEEEtran.bst features a very powerful and flexible mechanism for +% controlling the capitalization, punctuation, spacing, quotation, and +% newlines of the formatted entry fields. (Note: IEEEtran.bst does not need +% or use the newline/newblock feature, but it has been implemented for +% possible future use.) The output states of IEEEtran.bst consist of +% multiple independent attributes and, as such, can be thought of as being +% vectors, rather than the simple scalar values ("before.all", +% "mid.sentence", etc.) used in most other .bst files. +% +% The more flexible and complex design used here was motivated in part by +% the IEEE's rather unusual bibliography style. For example, the IEEE ends the +% previous field item with a period and large space prior to the publisher +% address; the @electronic entry types use periods as inter-item punctuation +% rather than the commas used by the other entry types; and URLs are never +% followed by periods even though they are the last item in the entry. +% Although it is possible to accommodate these features with the conventional +% output state system, the seemingly endless exceptions make for convoluted, +% unreliable and difficult to maintain code. +% +% IEEEtran.bst's output state system can be easily understood via a simple +% illustration of two most recently formatted entry fields (on the stack): +% +% CURRENT_ITEM +% "PREVIOUS_ITEM +% +% which, in this example, is to eventually appear in the bibliography as: +% +% "PREVIOUS_ITEM," CURRENT_ITEM +% +% It is the job of the output routine to take the previous item off of the +% stack (while leaving the current item at the top of the stack), apply its +% trailing punctuation (including closing quote marks) and spacing, and then +% to write the result to BibTeX's output buffer: +% +% "PREVIOUS_ITEM," +% +% Punctuation (and spacing) between items is often determined by both of the +% items rather than just the first one. The presence of quotation marks +% further complicates the situation because, in standard English, trailing +% punctuation marks are supposed to be contained within the quotes. +% +% IEEEtran.bst maintains two output state (aka "status") vectors which +% correspond to the previous and current (aka "this") items. Each vector +% consists of several independent attributes which track punctuation, +% spacing, quotation, and newlines. Capitalization status is handled by a +% separate scalar because the format routines, not the output routine, +% handle capitalization and, therefore, there is no need to maintain the +% capitalization attribute for both the "previous" and "this" items. +% +% When a format routine adds a new item, it copies the current output status +% vector to the previous output status vector and (usually) resets the +% current (this) output status vector to a "standard status" vector. Using a +% "standard status" vector in this way allows us to redefine what we mean by +% "standard status" at the start of each entry handler and reuse the same +% format routines under the various inter-item separation schemes. For +% example, the standard status vector for the @book entry type may use +% commas for item separators, while the @electronic type may use periods, +% yet both entry handlers exploit many of the exact same format routines. +% +% Because format routines have write access to the output status vector of +% the previous item, they can override the punctuation choices of the +% previous format routine! Therefore, it becomes trivial to implement rules +% such as "Always use a period and a large space before the publisher." By +% pushing the generation of the closing quote mark to the output routine, we +% avoid all the problems caused by having to close a quote before having all +% the information required to determine what the punctuation should be. +% +% The IEEEtran.bst output state system can easily be expanded if needed. +% For instance, it is easy to add a "space.tie" attribute value if the +% bibliography rules mandate that two items have to be joined with an +% unbreakable space. + +FUNCTION {initialize.status.constants} +{ #0 'punct.no := + #1 'punct.comma := + #2 'punct.period := + #0 'space.no := + #1 'space.normal := + #2 'space.large := + #0 'quote.no := + #1 'quote.close := + #0 'cap.no := + #1 'cap.yes := + #0 'nline.no := + #1 'nline.newblock := + #0 'japanese.flag := +} + +FUNCTION {std.status.using.comma} +{ punct.comma 'punct.std := + space.normal 'space.std := + quote.no 'quote.std := + nline.no 'nline.std := + cap.no 'cap.std := +} + +FUNCTION {std.status.using.period} +{ punct.period 'punct.std := + space.normal 'space.std := + quote.no 'quote.std := + nline.no 'nline.std := + cap.yes 'cap.std := +} + +FUNCTION {initialize.prev.this.status} +{ punct.no 'prev.status.punct := + space.no 'prev.status.space := + quote.no 'prev.status.quote := + nline.no 'prev.status.nline := + punct.no 'this.status.punct := + space.no 'this.status.space := + quote.no 'this.status.quote := + nline.no 'this.status.nline := + cap.yes 'status.cap := +} + +FUNCTION {this.status.std} +{ punct.std 'this.status.punct := + space.std 'this.status.space := + quote.std 'this.status.quote := + nline.std 'this.status.nline := +} + +FUNCTION {cap.status.std}{ cap.std 'status.cap := } + +FUNCTION {this.to.prev.status} +{ this.status.punct 'prev.status.punct := + this.status.space 'prev.status.space := + this.status.quote 'prev.status.quote := + this.status.nline 'prev.status.nline := +} + + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ { skip$ } + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + { skip$ } + if$ +} + + +% convert the strings "yes" or "no" to #1 or #0 respectively +FUNCTION {yes.no.to.int} +{ "l" change.case$ duplicate$ + "yes" = + { pop$ #1 } + { duplicate$ "no" = + { pop$ #0 } + { "unknown boolean " quote$ * swap$ * quote$ * + " in " * cite$ * warning$ + #0 + } + if$ + } + if$ +} + + +% pushes true if the single char string on the stack is in the +% range of "0" to "9" +FUNCTION {is.num} +{ chr.to.int$ + duplicate$ "0" chr.to.int$ < not + swap$ "9" chr.to.int$ > not and +} + +% multiplies the integer on the stack by a factor of 10 +FUNCTION {bump.int.mag} +{ #0 'multiresult := + { duplicate$ #0 > } + { #1 - + multiresult #10 + + 'multiresult := + } + while$ +pop$ +multiresult +} + +% converts a single character string on the stack to an integer +FUNCTION {char.to.integer} +{ duplicate$ + is.num + { chr.to.int$ "0" chr.to.int$ - } + {"noninteger character " quote$ * swap$ * quote$ * + " in integer field of " * cite$ * warning$ + #0 + } + if$ +} + +% converts a string on the stack to an integer +FUNCTION {string.to.integer} +{ duplicate$ text.length$ 'namesleft := + #1 'nameptr := + #0 'numnames := + { nameptr namesleft > not } + { duplicate$ nameptr #1 substring$ + char.to.integer numnames bump.int.mag + + 'numnames := + nameptr #1 + + 'nameptr := + } + while$ +pop$ +numnames +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% JAPANESE WORD TOGGLER %% +%%%%%%%%%%%%%%%%%%%%%%%%%%% + + +FUNCTION {bbl.ieej.year.pre} +{ japanese.flag #1 = + { bbl.ieej.jp.year.pre } + { bbl.ieej.en.year.pre } + if$ +} +FUNCTION {bbl.ieej.year.aft} +{ japanese.flag #1 = + { bbl.ieej.jp.year.aft } + { bbl.ieej.en.year.aft } + if$ +} +FUNCTION {bbl.ieej.title.pre} +{ japanese.flag #1 = + { bbl.ieej.jp.title.pre } + { bbl.ieej.en.title.pre } + if$ +} +FUNCTION {bbl.ieej.title.aft} +{ japanese.flag #1 = + { bbl.ieej.jp.title.aft } + { bbl.ieej.en.title.aft } + if$ +} +FUNCTION {bbl.ieej.chapter.pre} +{ japanese.flag #1 = + { bbl.ieej.jp.chapter.pre } + { bbl.ieej.en.chapter.pre } + if$ +} +FUNCTION {bbl.ieej.chapter.aft} +{ japanese.flag #1 = + { bbl.ieej.jp.chapter.aft } + { bbl.ieej.en.chapter.aft } + if$ +} +FUNCTION {bbl.ieej.chapter.tie.pre} +{ japanese.flag #1 = + { bbl.ieej.jp.chapter.tie.pre } + { bbl.ieej.en.chapter.tie.pre } + if$ +} +FUNCTION {bbl.ieej.chapter.tie.aft} +{ japanese.flag #1 = + { bbl.ieej.jp.chapter.tie.aft } + { bbl.ieej.en.chapter.tie.aft } + if$ +} +FUNCTION {bbl.etal} +{ japanese.flag #1 = + { bbl.etal.jp } + { bbl.etal.en } + if$ +} +FUNCTION {bbl.ieej.jp.author.title.sep} +{ use.ieej.abbrev #0 = + { bbl.ieej.jp.author.title.sep.F } + { bbl.ieej.jp.author.title.sep.A } + if$ +} +FUNCTION {bbl.ieej.en.author.title.sep} +{ use.ieej.abbrev #0 = + { bbl.ieej.en.author.title.sep.F } + { bbl.ieej.en.author.title.sep.A } + if$ +} +FUNCTION {bbl.ieej.author.title.sep} +{ japanese.flag #1 = + { bbl.ieej.jp.author.title.sep } + { bbl.ieej.en.author.title.sep } + if$ +} +FUNCTION {bbl.ieej.vol} +{ use.ieej.abbrev #0 = + { bbl.ieej.vol.F } + { bbl.ieej.vol.A } + if$ +} +FUNCTION {bbl.ieej.vol.aft} +{ use.ieej.abbrev #0 = + { bbl.ieej.vol.aft.F } + { bbl.ieej.vol.aft.A } + if$ +} +FUNCTION {bbl.ieej.no} +{ use.ieej.abbrev #0 = + { bbl.ieej.no.F } + { bbl.ieej.no.A } + if$ +} +FUNCTION {bbl.ieej.no.aft} +{ use.ieej.abbrev #0 = + { bbl.ieej.no.aft.F } + { bbl.ieej.no.aft.A } + if$ +} +FUNCTION {bbl.ieej.pages} +{ use.ieej.abbrev #0 = + { bbl.ieej.pages.F } + { bbl.ieej.pages.A } + if$ +} +FUNCTION {bbl.ieej.page} +{ use.ieej.abbrev #0 = + { bbl.ieej.page.F } + { bbl.ieej.page.A } + if$ +} + + + +% The output routines write out the *next* to the top (previous) item on the +% stack, adding punctuation and such as needed. Since IEEEtran.bst maintains +% the output status for the top two items on the stack, these output +% routines have to consider the previous output status (which corresponds to +% the item that is being output). Full independent control of punctuation, +% closing quote marks, spacing, and newblock is provided. +% +% "output.nonnull" does not check for the presence of a previous empty +% item. +% +% "output" does check for the presence of a previous empty item and will +% remove an empty item rather than outputing it. +% +% "output.warn" is like "output", but will issue a warning if it detects +% an empty item. + +FUNCTION {output.nonnull} +{ swap$ + prev.status.quote quote.close = + { use.ieej.setting #1 = + { bbl.ieej.title.aft * } + { japanese.flag #1 = { "''" * } { skip$ } if$ } + if$ + } + { skip$ } + if$ + prev.status.punct punct.comma = + { japanese.flag #0 = { "," * } { "," * } if$ } + { skip$ } + if$ + prev.status.punct punct.period = + { japanese.flag #0 = { add.period$ } { "." * } if$ } + { skip$ } + if$ + use.ieej.setting #0 = japanese.flag #0 = and + { prev.status.quote quote.close = { "''" * } { skip$ } if$ } + { skip$ } + if$ + prev.status.space space.normal = + { japanese.flag #0 = { " " * } { skip$ } if$ } + { skip$ } + if$ + prev.status.space space.large = + { large.space * } + { skip$ } + if$ + write$ + prev.status.nline nline.newblock = + { newline$ "\newblock " write$ } + { skip$ } + if$ +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.warn} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * " in " * cite$ * warning$ } + 'output.nonnull + if$ +} + + +% "fin.entry" is the output routine that handles the last item of the entry +% (which will be on the top of the stack when "fin.entry" is called). + +FUNCTION {fin.entry} +{ this.status.punct punct.no = + { skip$ } + { japanese.flag #0 = { add.period$ } { "." * } if$ } + if$ + this.status.quote quote.close = + { "''" * } + { skip$ } + if$ + write$ + newline$ + %% for JP setting + #0 'japanese.flag := + default.name.format.en.string 'name.format.string := +} + + +FUNCTION {is.last.char.not.punct} +{ duplicate$ + "}" * add.period$ + #-1 #1 substring$ "." = +} + +FUNCTION {is.multiple.pages} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {capitalize}{ "u" change.case$ "t" change.case$ } + +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "\emph{" swap$ * "}" * } + if$ +} + +FUNCTION {do.name.latex.cmd} +{ name.latex.cmd + empty$ + { skip$ } + { name.latex.cmd "{" * swap$ * "}" * } + if$ +} + +% IEEEtran.bst uses its own \BIBforeignlanguage command which directly +% invokes the TeX hyphenation patterns without the need of the Babel +% package. Babel does a lot more than switch hyphenation patterns and +% its loading can cause unintended effects in many class files (such as +% IEEEtran.cls). +FUNCTION {select.language} +{ duplicate$ empty$ 'pop$ + { language empty$ bbl.use.select.language #0 = or 'skip$ + { "\BIBforeignlanguage{" language * "}{" * swap$ * "}" * } + if$ + } + if$ +} + +FUNCTION {tie.or.space.prefix} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ +} + +FUNCTION {get.bbl.editor} +{ editor num.names$ #1 > 'bbl.editors 'bbl.editor if$ } + +FUNCTION {space.word} +{ " " swap$ * " " * } + + +% Field Conditioners, Converters, Checkers and External Interfaces + +FUNCTION {empty.field.to.null.string} +{ duplicate$ empty$ + { pop$ "" } + { skip$ } + if$ +} + +FUNCTION {either.or.check} +{ empty$ + { pop$ } + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {empty.entry.warn} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ url empty$ + and and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + + +% The bibinfo system provides a way for the electronic parsing/acquisition +% of a bibliography's contents as is done by ReVTeX. For example, a field +% could be entered into the bibliography as: +% \bibinfo{volume}{2} +% Only the "2" would show up in the document, but the LaTeX \bibinfo command +% could do additional things with the information. IEEEtran.bst does provide +% a \bibinfo command via "\providecommand{\bibinfo}[2]{#2}". However, it is +% currently not used as the bogus bibinfo functions defined here output the +% entry values directly without the \bibinfo wrapper. The bibinfo functions +% themselves (and the calls to them) are retained for possible future use. +% +% bibinfo.check avoids acting on missing fields while bibinfo.warn will +% issue a warning message if a missing field is detected. Prior to calling +% the bibinfo functions, the user should push the field value and then its +% name string, in that order. + +FUNCTION {bibinfo.check} +{ swap$ duplicate$ missing$ + { pop$ pop$ "" } + { duplicate$ empty$ + { swap$ pop$ } + { swap$ pop$ } + if$ + } + if$ +} + +FUNCTION {bibinfo.warn} +{ swap$ duplicate$ missing$ + { swap$ "missing " swap$ * " in " * cite$ * warning$ pop$ "" } + { duplicate$ empty$ + { swap$ "empty " swap$ * " in " * cite$ * warning$ } + { swap$ pop$ } + if$ + } + if$ +} + + +% The IEEE separates large numbers with more than 4 digits into groups of +% three. The IEEE uses a small space to separate these number groups. +% Typical applications include patent and page numbers. + +% number of consecutive digits required to trigger the group separation. +FUNCTION {large.number.trigger}{ #5 } + +% For numbers longer than the trigger, this is the blocksize of the groups. +% The blocksize must be less than the trigger threshold, and 2 * blocksize +% must be greater than the trigger threshold (can't do more than one +% separation on the initial trigger). +FUNCTION {large.number.blocksize}{ #3 } + +% What is actually inserted between the number groups. +FUNCTION {large.number.separator}{ "\," } + +% So as to save on integer variables by reusing existing ones, numnames +% holds the current number of consecutive digits read and nameptr holds +% the number that will trigger an inserted space. +FUNCTION {large.number.separate} +{ 't := + "" + #0 'numnames := + large.number.trigger 'nameptr := + { t empty$ not } + { t #-1 #1 substring$ is.num + { numnames #1 + 'numnames := } + { #0 'numnames := + large.number.trigger 'nameptr := + } + if$ + t #-1 #1 substring$ swap$ * + t #-2 global.max$ substring$ 't := + numnames nameptr = + { duplicate$ #1 nameptr large.number.blocksize - substring$ swap$ + nameptr large.number.blocksize - #1 + global.max$ substring$ + large.number.separator swap$ * * + nameptr large.number.blocksize - 'numnames := + large.number.blocksize #1 + 'nameptr := + } + { skip$ } + if$ + } + while$ +} + +% Converts all single dashes "-" to double dashes "--". +FUNCTION {n.dashify} +{ large.number.separate + 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + + +% This function detects entries with names that are identical to that of +% the previous entry and replaces the repeated names with dashes (if the +% "is.dash.repeated.names" user control is nonzero). +FUNCTION {name.or.dash} +{ 's := + oldname empty$ + { s 'oldname := s } + { s oldname = + { is.dash.repeated.names + { repeated.name.dashes } + { s 'oldname := s } + if$ + } + { s 'oldname := s } + if$ + } + if$ +} + +% Converts the number string on the top of the stack to +% "numerical ordinal form" (e.g., "7" to "7th"). There is +% no artificial limit to the upper bound of the numbers as the +% two least significant digits determine the ordinal form. +FUNCTION {num.to.ordinal} +{ duplicate$ #-2 #1 substring$ "1" = + { bbl.th * } + { duplicate$ #-1 #1 substring$ "1" = + { bbl.st * } + { duplicate$ #-1 #1 substring$ "2" = + { bbl.nd * } + { duplicate$ #-1 #1 substring$ "3" = + { bbl.rd * } + { bbl.th * } + if$ + } + if$ + } + if$ + } + if$ +} + +% If the string on the top of the stack begins with a number, +% (e.g., 11th) then replace the string with the leading number +% it contains. Otherwise retain the string as-is. s holds the +% extracted number, t holds the part of the string that remains +% to be scanned. +FUNCTION {extract.num} +{ duplicate$ 't := + "" 's := + { t empty$ not } + { t #1 #1 substring$ + t #2 global.max$ substring$ 't := + duplicate$ is.num + { s swap$ * 's := } + { pop$ "" 't := } + if$ + } + while$ + s empty$ + 'skip$ + { pop$ s } + if$ +} + +% Converts the word number string on the top of the stack to +% Arabic string form. Will be successful up to "tenth". +FUNCTION {word.to.num} +{ duplicate$ "l" change.case$ 's := + s "first" = + { pop$ "1" } + { skip$ } + if$ + s "second" = + { pop$ "2" } + { skip$ } + if$ + s "third" = + { pop$ "3" } + { skip$ } + if$ + s "fourth" = + { pop$ "4" } + { skip$ } + if$ + s "fifth" = + { pop$ "5" } + { skip$ } + if$ + s "sixth" = + { pop$ "6" } + { skip$ } + if$ + s "seventh" = + { pop$ "7" } + { skip$ } + if$ + s "eighth" = + { pop$ "8" } + { skip$ } + if$ + s "ninth" = + { pop$ "9" } + { skip$ } + if$ + s "tenth" = + { pop$ "10" } + { skip$ } + if$ +} + + +FUNCTION {month.word.to.num} +{ duplicate$ "l" change.case$ 's := + s "jan." = s "jan" = s "january" = or or { pop$ "1" } { skip$ } if$ + s "feb." = s "feb" = s "febuary" = or or { pop$ "2" } { skip$ } if$ + s "mar." = s "mar" = s "march" = or or { pop$ "3" } { skip$ } if$ + s "apr." = s "apr" = s "april" = or or { pop$ "4" } { skip$ } if$ + s "may." = s "may" = s "may" = or or { pop$ "5" } { skip$ } if$ + s "jun." = s "jun" = s "june" = or or { pop$ "6" } { skip$ } if$ + s "jul." = s "jul" = s "july" = or or { pop$ "7" } { skip$ } if$ + s "aug." = s "aug" = s "august" = or or { pop$ "8" } { skip$ } if$ + s "sep." = s "sep" = s "september" = or or { pop$ "9" } { skip$ } if$ + s "oct." = s "oct" = s "october" = or or { pop$ "10" } { skip$ } if$ + s "nov." = s "nov" = s "november" = or or { pop$ "11" } { skip$ } if$ + s "dec." = s "dec" = s "december" = or or { pop$ "12" } { skip$ } if$ +} + + +FUNCTION {month.num.to.word} +{ duplicate$ "l" change.case$ 's := + s "1" = { pop$ "Jan." } { skip$ } if$ + s "2" = { pop$ "Feb." } { skip$ } if$ + s "3" = { pop$ "Mar." } { skip$ } if$ + s "4" = { pop$ "Apr." } { skip$ } if$ + s "5" = { pop$ "May" } { skip$ } if$ + s "6" = { pop$ "June" } { skip$ } if$ + s "7" = { pop$ "July" } { skip$ } if$ + s "8" = { pop$ "Aug." } { skip$ } if$ + s "9" = { pop$ "Sep." } { skip$ } if$ + s "10" = { pop$ "Oct." } { skip$ } if$ + s "11" = { pop$ "Nov." } { skip$ } if$ + s "12" = { pop$ "Dec." } { skip$ } if$ +} + +% Converts the string on the top of the stack to numerical +% ordinal (e.g., "11th") form. +FUNCTION {convert.edition} +{ duplicate$ empty$ 'skip$ + { duplicate$ #1 #1 substring$ is.num + { extract.num + num.to.ordinal + } + { word.to.num + duplicate$ #1 #1 substring$ is.num + { num.to.ordinal } + { "edition ordinal word " quote$ * edition * quote$ * + " may be too high (or improper) for conversion" * " in " * cite$ * warning$ + } + if$ + } + if$ + } + if$ +} + + +%%%%%%%%%%%%%%%%%%%%%% +%% JAPANESE HANDLER %% +%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {chk.jp.kanji.str} +% pbibtexで用意されている is.kanji.str$ 関数を使用して日本語エントリか確認 +{ duplicate$ empty$ + { pop$ #0 } % フィールドが空ならチェックせず #0 を返す + { is.kanji.str$ #1 = { #1 } { #0 } if$ } + if$ +} + + +FUNCTION {chk.jp.entry.pbibtex} +% author, title, journal, publisher のフィールドについて +% 日本語文字を探索し、どれか一つでも日本語が含まれていたら +% japanese.flag に #1 を代入、名前フォーマットも上書き +{ author chk.jp.kanji.str #1 = + title chk.jp.kanji.str #1 = or + journal chk.jp.kanji.str #1 = or + publisher chk.jp.kanji.str #1 = or + { #1 'japanese.flag := + default.name.format.jp.string 'name.format.string := } + { skip$ } + if$ +} + + +FUNCTION {emphasize.title} +% タイトルの強調表示設定、emphasize すると \emph{} 内に入れるため、英語では斜体になる。 +% 日本語ではゴシック体となるが、不自然なためデフォルトでは \emph{} に入れる処理をスキップ。 +{ 's := + use.ieej.setting #0 = + { japanese.flag #1 = + % IEEE/JP は 設定により emphasize (斜体ではなく太字になり不自然なため) + { ieee.jp.setting.emph.title #1 = { emphasize } { skip$ } if$ } + % IEEE/EN は emphasize + { emphasize } + if$ + } + { japanese.flag #1 = + % 電気学会では、日本語も英語も設定で変更。 + { ieej.jp.setting.emph.journal #1 = s "journal" = and { #1 } { #0 } if$ + ieej.jp.setting.emph.booktitle #1 = s "booktitle" = and { #1 } { #0 } if$ + or { emphasize } { skip$ } if$ + } + { ieej.en.setting.emph.journal #1 = s "journal" = and { #1 } { #0 } if$ + ieej.en.setting.emph.booktitle #1 = s "booktitle" = and { #1 } { #0 } if$ + or { emphasize } { skip$ } if$ + } + if$ + } + if$ +} + + +FUNCTION {format.jp.edition} +% 版情報の整形 +% 日本語では 第n版 と、第と版で挟む。第1版は初版へと変更する。 +% 英語では 1st ed. 2nd ed. 等へと整形する。 +{ use.ieej.setting #1 = japanese.flag #1 = and + { duplicate$ "1" = { pop$ "初版" * } { "第" swap$ * * "版" * } if$ } + { convert.edition "l" change.case$ * "~" * bbl.edition * } + if$ +} + + +FUNCTION {bbl.title.edition.sep} +% 本のタイトルと版情報の間の区切り文字を制御。 +{ japanese.flag #1 = { "," * } { ", " * } if$ } + + +FUNCTION {format.jp.year} +% 電気学会形式では、出版社は ( と ) で挟む +% ただしオプションで変更可 +{ use.ieej.setting #1 = + { bbl.ieej.year.aft * bbl.ieej.year.pre swap$ * * } + { * } + if$ +} + + +FUNCTION {format.jp.title} +% 電気学会形式かつ日本語文献のときは、タイトルを 「 と 」 で挟む +% ただしオプションで変更可 +{ use.ieej.setting #1 = japanese.flag #1 = and + { bbl.ieej.title.pre swap$ * bbl.ieej.title.aft * } + { skip$ } + if$ +} + + +FUNCTION {author.sep} +% IEEEでも電気学会でも、最後の著者以外は +% 所定文字を場合分けして挿入する +{ use.ieej.setting #0 = + { japanese.flag #1 = { "," } { ", " } if$ } + { japanese.flag #1 = { bbl.ieej.jp.author.sep } { bbl.ieej.en.author.sep } if$ } + if$ +} + + +FUNCTION {author.sep.last} +{ use.ieej.setting #0 = + { japanese.flag #0 = % IEEE 形式の場合、and の取り扱いに注意 + { ", " * bbl.and space.word } % 英語ではカンマの後 and を挿入 + { "," } % 日本語では他と同様に全角カンマのみ + if$ + } + { japanese.flag #0 = % 電気学会形式の場合、and を使用せず、予め設定したものを返す + { bbl.ieej.en.author.sep } + { bbl.ieej.jp.author.sep } + if$ + } + if$ +} + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% LATEX BIBLIOGRAPHY CODE %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {start.entry} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + "" + initialize.prev.this.status + chk.jp.entry.pbibtex +} + +% Here we write out all the LaTeX code that we will need. The most involved +% code sequences are those that control the alternate interword spacing and +% foreign language hyphenation patterns. The heavy use of \providecommand +% gives users a way to override the defaults. Special thanks to Javier Bezos, +% Johannes Braams, Robin Fairbairns, Heiko Oberdiek, Donald Arseneau and all +% the other gurus on comp.text.tex for their help and advice on the topic of +% \selectlanguage, Babel and BibTeX. +FUNCTION {begin.bib} +{ "% Generated by " bst.file.name * ", version: " * + bst.file.version * " (" * bst.file.date * ")" * + write$ newline$ + preamble$ empty$ 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{thebibliography}{" longest.label * "}" * + write$ newline$ + "\providecommand{\url}[1]{#1}" + write$ newline$ + "\csname url@samestyle\endcsname" + write$ newline$ + "\providecommand{\newblock}{\relax}" + write$ newline$ + "\providecommand{\bibinfo}[2]{#2}" + write$ newline$ + "\providecommand{\BIBentrySTDinterwordspacing}{\spaceskip=0pt\relax}" + write$ newline$ + "\providecommand{\BIBentryALTinterwordstretchfactor}{" + ALTinterwordstretchfactor * "}" * + write$ newline$ + "\providecommand{\BIBentryALTinterwordspacing}{\spaceskip=\fontdimen2\font plus " + write$ newline$ + "\BIBentryALTinterwordstretchfactor\fontdimen3\font minus \fontdimen4\font\relax}" + write$ newline$ + "\providecommand{\BIBforeignlanguage}[2]{{%" + write$ newline$ + "\expandafter\ifx\csname l@#1\endcsname\relax" + write$ newline$ + "\typeout{** WARNING: " bst.file.name * ": No hyphenation pattern has been}%" * + write$ newline$ + "\typeout{** loaded for the language `#1'. Using the pattern for}%" + write$ newline$ + "\typeout{** the default language instead.}%" + write$ newline$ + "\else" + write$ newline$ + "\language=\csname l@#1\endcsname" + write$ newline$ + "\fi" + write$ newline$ + "#2}}" + write$ newline$ + "\providecommand{\BIBdecl}{\relax}" + write$ newline$ + "\BIBdecl" + write$ newline$ +} + +FUNCTION {end.bib} +{ newline$ "\end{thebibliography}" write$ newline$ } + +FUNCTION {if.url.alt.interword.spacing} +{ is.use.alt.interword.spacing + { is.use.url + { url empty$ 'skip$ {"\BIBentryALTinterwordspacing" write$ newline$} if$ } + { skip$ } + if$ + } + { skip$ } + if$ +} + +FUNCTION {if.url.std.interword.spacing} +{ is.use.alt.interword.spacing + { is.use.url + { url empty$ 'skip$ {"\BIBentrySTDinterwordspacing" write$ newline$} if$ } + { skip$ } + if$ + } + { skip$ } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%%%%%% +%% LONGEST LABEL PASS %% +%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} + +FUNCTION {longest.label.pass} +{ type$ "ieeetranbstctl" = + { skip$ } + { number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + { skip$ } + if$ + } + if$ +} + + + +%%%%%%%%%%%%%%%%%%%%% +%% FORMAT HANDLERS %% +%%%%%%%%%%%%%%%%%%%%% + +%% Lower Level Formats (used by higher level formats) + +FUNCTION {format.pub} +{ 't := + "" + t empty$ + { skip$ } + { this.to.prev.status + this.status.std + cap.status.std + t * + } + if$ +} + +FUNCTION {format.address.org.or.pub.date} +{ 't := + "" + year empty$ + { "empty year in " cite$ * warning$ } + { skip$ } + if$ + address empty$ t empty$ and + year empty$ and month empty$ and + { skip$ } + { this.to.prev.status + this.status.std + cap.status.std + address "address" bibinfo.check * + t empty$ + { skip$ } + { japanese.flag #1 = + { punct.no 'prev.status.punct := } + { punct.period 'prev.status.punct := } + if$ + space.large 'prev.status.space := + address empty$ + { skip$ } + { ": " * } + if$ + t * + } + if$ + language empty.field.to.null.string + duplicate$ empty$ bbl.format.language #1 = not or + { * } + { capitalize " (in " swap$ * ")" * * } + if$ + year empty$ month empty$ and + { skip$ } + { t empty$ address empty$ and + { skip$ } + { use.ieej.setting #1 = + { japanese.flag #1 = { skip$ } { " " * } if$ } + { japanese.flag #1 = { "," * } { ", " * } if$ } + if$ + } + if$ + month empty$ + { year empty$ + { skip$ } + { year "year" bibinfo.check format.jp.year } + if$ + } + { month "month" bibinfo.check month.word.to.num + use.ieej.setting #1 = + { format.month.ieej #1 = { month.num.to.word } { skip$ } if$ } + { format.month.ieee #1 = { month.num.to.word } { skip$ } if$ } + if$ + * + year empty$ + { skip$ } + { " " * year "year" bibinfo.check * } + if$ + } + if$ + } + if$ + } + if$ +} + +FUNCTION {format.names} +{ 'bibinfo := + duplicate$ empty$ 'skip$ { + this.to.prev.status + this.status.std + 's := + japanese.flag #1 = { s purify$ 's := } { skip$ } if$ + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr name.format.string format.name$ + s nameptr "~{ll}" format.name$ = % check for insititution(s) without space + { s nameptr "{ll}" format.name$ } % for institution(s) without space + { s nameptr name.format.string format.name$ } % for usual author(s) + if$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { nameptr num.names.shown.with.forced.et.al #1 + = + numnames max.num.names.before.forced.et.al > + is.forced.et.al and and + { "others" 't := #1 'namesleft := } + { skip$ } + if$ + namesleft #1 > + { author.sep * t do.name.latex.cmd * } + { s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + t "others" = + { japanese.flag #1 = + { "・" * bbl.etal } + { " " * bbl.etal emphasize } + if$ * + } + { author.sep.last * t do.name.latex.cmd * } + if$ + } + if$ + } + { t do.name.latex.cmd } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + cap.status.std + } if$ +} + + + + +%% Higher Level Formats + +%% addresses/locations + +FUNCTION {format.address} +{ address duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% author/editor names + +FUNCTION {format.authors} +{ author "author" format.names + use.ieej.setting #1 = + { bbl.ieej.author.title.sep * + punct.no 'this.status.punct := } + { skip$ } + if$ +} + +FUNCTION {format.editors} +{ editor "editor" format.names duplicate$ empty$ 'skip$ + { ", " * + get.bbl.editor + capitalize + * + } + if$ +} + + + +%% date + +FUNCTION {format.date} +{ month "month" bibinfo.check month.word.to.num + use.ieej.setting #1 = + { format.month.ieej #1 = { month.num.to.word } { skip$ } if$ } + { format.month.ieee #1 = { month.num.to.word } { skip$ } if$ } + if$ + duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + "there's a month but no year in " cite$ * warning$ } + if$ + * + } + { this.to.prev.status + this.status.std + cap.status.std + use.ieej.setting #1 = + { swap$ + { * } + { use.ieej.abbrev #1 = + { swap$ pop$ } + { bbl.ieej.year.month.sep * swap$ * } + if$ + } + if$ + } + { swap$ 'skip$ { swap$ " " * swap$ } if$ * } + if$ + use.ieej.setting #1 = + { bbl.ieej.year.aft * bbl.ieej.year.pre swap$ * + ieej.setting.punct.year.aft #0 = + { punct.no 'this.status.punct := } + { skip$ } + if$ + ieej.setting.comma.year.pre #0 = + { punct.no 'prev.status.punct := } + { skip$ } + if$ + } + { skip$ } + if$ + } + if$ +} + +FUNCTION {format.date.electronic} +{ month "month" bibinfo.check duplicate$ empty$ + year "year" bibinfo.check duplicate$ empty$ + { swap$ + { pop$ } + { "there's a month but no year in " cite$ * warning$ + pop$ ")" * "(" swap$ * + this.to.prev.status + punct.no 'this.status.punct := + space.normal 'this.status.space := + quote.no 'this.status.quote := + cap.yes 'status.cap := + } + if$ + } + { swap$ + { swap$ pop$ ")" * "(" swap$ * } + { "(" swap$ * ", " * swap$ * ")" * } + if$ + this.to.prev.status + punct.no 'this.status.punct := + space.normal 'this.status.space := + quote.no 'this.status.quote := + cap.yes 'status.cap := + } + if$ +} + + + +%% edition/title + +% Note: The IEEE considers the edition to be closely associated with +% the title of a book. So, in IEEEtran.bst the edition is normally handled +% within the formatting of the title. The format.edition function is +% retained here for possible future use. +FUNCTION {format.edition} +{ edition duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + convert.edition + status.cap + { "t" } + { "l" } + if$ change.case$ + "edition" bibinfo.check + "~" * bbl.edition * + cap.status.std + } + if$ +} + +% This is used to format the booktitle of a conference proceedings. +% Here we use the "intype" field to provide the user a way to +% override the word "in" (e.g., with things like "presented at") +% Use of intype stops the emphasis of the booktitle to indicate that +% we no longer mean the written conference proceedings, but the +% conference itself. +FUNCTION {format.in.booktitle} +{ booktitle "booktitle" bibinfo.check duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + select.language + intype missing$ + { japanese.flag #1 = + { "" } + { "booktitle" emphasize.title bbl.in " " * } + if$ + } + { intype " " * } + if$ + swap$ * + cap.status.std + } + if$ +} + + +% This is used to format the booktitle of collection. +% Here the "intype" field is not supported, but "edition" is. +FUNCTION {format.in.booktitle.edition} +{ booktitle "booktitle" bibinfo.check duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + select.language + japanese.flag #1 = + { punct.comma 'prev.status.punct := } + { skip$ } + if$ + "booktitle" emphasize.title + edition empty$ + { skip$ } + { bbl.title.edition.sep edition format.jp.edition } + if$ + japanese.flag #1 = + { space.normal 'prev.status.space := } + { bbl.in " " * swap$ *} + if$ + cap.status.std + } + if$ +} + +FUNCTION {format.article.title} +{ title duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + "t" change.case$ + } + if$ + "title" bibinfo.check + duplicate$ empty$ 'skip$ + { quote.close 'this.status.quote := + is.last.char.not.punct + { punct.std 'this.status.punct := } + { use.ieej.setting #1 = bbl.ieej.force.punct.aft.quote #1 = and + { punct.std 'this.status.punct := } + { punct.no 'this.status.punct := } + if$ + } + if$ + select.language + use.ieej.setting #1 = + { bbl.ieej.title.pre swap$ * } + { "``" swap$ * } + if$ + cap.status.std + } + if$ +} + +FUNCTION {format.article.title.electronic} +{ title duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + "t" change.case$ + } + if$ + "title" bibinfo.check + duplicate$ empty$ + { skip$ } + { select.language } + if$ +} + +FUNCTION {format.book.title.edition} +{ title "title" bibinfo.check + duplicate$ empty$ + { "empty title in " cite$ * warning$ } + { this.to.prev.status + this.status.std + select.language + format.jp.title + "booktitle" emphasize.title + edition empty$ + { skip$ } + { bbl.title.edition.sep edition format.jp.edition } + if$ + use.ieej.setting #1 = + { space.normal 'prev.status.space := } + { skip$ } + if$ + cap.status.std + punct.comma 'this.status.punct := + use.ieej.setting #1 = + { skip$ } + { punct.comma 'prev.status.punct := } + if$ + } + if$ +} + +FUNCTION {format.book.title} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + select.language + format.jp.title + "booktitle" emphasize.title + } + if$ +} + + + +%% journal + +FUNCTION {format.journal} +{ journal duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + select.language + "journal" emphasize.title + } + if$ +} + + + +%% how published + +FUNCTION {format.howpublished} +{ howpublished duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + + + +%% institutions/organization/publishers/school + +FUNCTION {format.institution} +{ institution duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + +FUNCTION {format.organization} +{ organization duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + +FUNCTION {format.publisher} +{ publisher "publisher" bibinfo.warn format.pub } + +FUNCTION {format.address.publisher.date} +{ publisher "publisher" bibinfo.warn format.address.org.or.pub.date } + +FUNCTION {format.address.publisher.date.nowarn} +{ publisher "publisher" bibinfo.check format.address.org.or.pub.date } + +FUNCTION {format.address.organization.date} +{ organization "organization" bibinfo.check format.address.org.or.pub.date } + +FUNCTION {format.school} +{ school duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + cap.status.std + } + if$ +} + +FUNCTION {format.language} +{ language empty.field.to.null.string + duplicate$ empty$ bbl.format.language #0 = or 'skip$ + { this.to.prev.status + this.status.std + capitalize + punct.comma 'this.status.punct := + bbl.format.language.punct #0 = + { punct.no 'this.status.punct := } + { skip$ } + if$ + "(in " swap$ * ")" * + cap.status.std + } + if$ +} + + +%% volume/number/series/chapter/pages + +FUNCTION {format.volume} +{ volume empty.field.to.null.string + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + use.ieej.setting #1 = + { bbl.ieej.vol swap$ "volume" bibinfo.check * bbl.ieej.vol.aft * + use.ieej.abbrev #1 = + { punct.no 'this.status.punct := + space.no 'this.status.space := + } + { skip$ } + if$ + } + { bbl.volume + status.cap + { capitalize } + { skip$ } + if$ + swap$ tie.or.space.prefix + "volume" bibinfo.check + * * + cap.status.std + } + if$ + } + if$ +} + +FUNCTION {format.number} +{ number empty.field.to.null.string + duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + use.ieej.setting #1 = + { bbl.ieej.no swap$ "number" bibinfo.check * bbl.ieej.no.aft * } + { status.cap + { bbl.number capitalize } + { bbl.number } + if$ + swap$ tie.or.space.prefix + "number" bibinfo.check + * * + cap.status.std + } + if$ + } + if$ +} + +FUNCTION {format.number.if.use.for.article} +{ is.use.number.for.article + { format.number } + { "" } + if$ +} + +% The IEEE does not seem to tie the series so closely with the volume +% and number as is done in other bibliography styles. Instead the +% series is treated somewhat like an extension of the title. +FUNCTION {format.series} +{ series empty$ + { "" } + { this.to.prev.status + this.status.std + bbl.series " " * + series "series" bibinfo.check * + cap.status.std + } + if$ +} + + +FUNCTION {format.chapter} +{ chapter empty$ + { "" } + { this.to.prev.status + this.status.std + use.ieej.setting #0 = + { type empty$ + { bbl.chapter } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter tie.or.space.prefix + "chapter" bibinfo.check + * * + cap.status.std + } + { type empty$ + { bbl.ieej.chapter.pre } + { type "l" change.case$ + "type" bibinfo.check + } + if$ + chapter + bbl.ieej.chapter.tie.pre #1 = + { tie.or.space.prefix } + { "" } + if$ + "chapter" bibinfo.check + * * + bbl.ieej.chapter.aft + bbl.ieej.chapter.tie.aft #1 = + { tie.or.space.prefix } + { "" } + if$ + "chapter" bibinfo.check + * * + cap.status.std + } + if$ + } + if$ +} + + +% The intended use of format.paper is for paper numbers of inproceedings. +% The paper type can be overridden via the type field. +% We allow the type to be displayed even if the paper number is absent +% for things like "postdeadline paper" +FUNCTION {format.paper} +{ is.use.paper + { paper empty$ + { type empty$ + { "" } + { this.to.prev.status + this.status.std + type "type" bibinfo.check + cap.status.std + } + if$ + } + { this.to.prev.status + this.status.std + type empty$ + { bbl.paper } + { type "type" bibinfo.check } + if$ + " " * paper + "paper" bibinfo.check + * + cap.status.std + } + if$ + } + { "" } + if$ +} + + +FUNCTION {format.pages} +{ pages duplicate$ empty$ 'skip$ + { this.to.prev.status + this.status.std + duplicate$ is.multiple.pages + { use.ieej.setting #1 = + { bbl.ieej.pages swap$ } + { bbl.pages swap$ } + if$ + n.dashify + } + { use.ieej.setting #1 = + { bbl.ieej.page swap$ } + { bbl.page swap$ } + if$ + } + if$ + use.ieej.setting #1 = { "" } { tie.or.space.prefix } if$ + "pages" bibinfo.check + * * + cap.status.std + } + if$ +} + + + +%% technical report number + +FUNCTION {format.tech.report.number} +{ number "number" bibinfo.check + this.to.prev.status + this.status.std + cap.status.std + type duplicate$ empty$ + { pop$ + bbl.techrep + } + { skip$ } + if$ + "type" bibinfo.check + swap$ duplicate$ empty$ + { pop$ } + { tie.or.space.prefix * * } + if$ +} + + + +%% note + +FUNCTION {format.note} +{ note empty$ + { "" } + { this.to.prev.status + this.status.std + punct.period 'this.status.punct := + note #1 #1 substring$ + duplicate$ "{" = + { skip$ } + { status.cap + { "u" } + { "l" } + if$ + change.case$ + } + if$ + note #2 global.max$ substring$ * "note" bibinfo.check + cap.yes 'status.cap := + } + if$ +} + + + +%% patent + +FUNCTION {format.patent.date} +{ this.to.prev.status + this.status.std + year empty$ + { monthfiled duplicate$ empty$ + { "monthfiled" bibinfo.check pop$ "" } + { "monthfiled" bibinfo.check } + if$ + dayfiled duplicate$ empty$ + { "dayfiled" bibinfo.check pop$ "" * } + { "dayfiled" bibinfo.check + monthfiled empty$ + { "dayfiled without a monthfiled in " cite$ * warning$ + * + } + { " " swap$ * * } + if$ + } + if$ + yearfiled empty$ + { "no year or yearfiled in " cite$ * warning$ } + { yearfiled "yearfiled" bibinfo.check + swap$ + duplicate$ empty$ + { pop$ } + { ", " * swap$ * } + if$ + } + if$ + } + { month duplicate$ empty$ + { "month" bibinfo.check pop$ "" } + { "month" bibinfo.check } + if$ + day duplicate$ empty$ + { "day" bibinfo.check pop$ "" * } + { "day" bibinfo.check + month empty$ + { "day without a month in " cite$ * warning$ + * + } + { " " swap$ * * } + if$ + } + if$ + year "year" bibinfo.check + swap$ + duplicate$ empty$ + { pop$ } + { ", " * swap$ * } + if$ + } + if$ + cap.status.std +} + +FUNCTION {format.patent.nationality.type.number} +{ this.to.prev.status + this.status.std + nationality duplicate$ empty$ + { "nationality" bibinfo.warn pop$ "" } + { "nationality" bibinfo.check + duplicate$ "l" change.case$ "united states" = + { pop$ bbl.patentUS } + { skip$ } + if$ + " " * + } + if$ + type empty$ + { bbl.patent "type" bibinfo.check } + { type "type" bibinfo.check } + if$ + * + number duplicate$ empty$ + { "number" bibinfo.warn pop$ } + { "number" bibinfo.check + large.number.separate + swap$ " " * swap$ * + } + if$ + cap.status.std +} + + + +%% standard + +FUNCTION {format.organization.institution.standard.type.number} +{ this.to.prev.status + this.status.std + organization duplicate$ empty$ + { pop$ + institution duplicate$ empty$ + { "institution" bibinfo.warn } + { "institution" bibinfo.warn " " * } + if$ + } + { "organization" bibinfo.warn " " * } + if$ + type empty$ + { bbl.standard "type" bibinfo.check } + { type "type" bibinfo.check } + if$ + * + number duplicate$ empty$ + { "number" bibinfo.check pop$ } + { "number" bibinfo.check + large.number.separate + swap$ " " * swap$ * + } + if$ + cap.status.std +} + +FUNCTION {format.revision} +{ revision empty$ + { "" } + { this.to.prev.status + this.status.std + bbl.revision + revision tie.or.space.prefix + "revision" bibinfo.check + * * + cap.status.std + } + if$ +} + + +%% thesis + +FUNCTION {format.master.thesis.type} +{ this.to.prev.status + this.status.std + type empty$ + { + bbl.mthesis + } + { + type "type" bibinfo.check + } + if$ +cap.status.std +} + +FUNCTION {format.phd.thesis.type} +{ this.to.prev.status + this.status.std + type empty$ + { + bbl.phdthesis + } + { + type "type" bibinfo.check + } + if$ +cap.status.std +} + + + +%% URL + +FUNCTION {format.url} +{ is.use.url + { url empty$ + { "" } + { this.to.prev.status + this.status.std + cap.yes 'status.cap := + name.url.prefix " " * + "\url{" * url * "}" * + punct.no 'this.status.punct := + punct.period 'prev.status.punct := + space.normal 'this.status.space := + space.normal 'prev.status.space := + quote.no 'this.status.quote := + } + if$ + } + { "" } + if$ +} + + + + +%%%%%%%%%%%%%%%%%%%% +%% ENTRY HANDLERS %% +%%%%%%%%%%%%%%%%%%%% + + +% Note: In many journals, the IEEE (or the authors) tend not to show the number +% for articles, so the display of the number is controlled here by the +% switch "is.use.number.for.article" +FUNCTION {article} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + use.ieej.abbrev #1 = + { skip$ } + { format.article.title "title" output.warn } + if$ + bbl.format.language #1 = { format.language output } 'skip$ if$ + format.journal "journal" bibinfo.check "journal" output.warn + format.volume output + format.number.if.use.for.article output + format.pages output + format.date "year" output.warn + format.note output + format.url output + bbl.format.language #2 = { format.language output } 'skip$ if$ + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {book} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + author empty$ + { format.editors "author and editor" output.warn } + { format.authors output.nonnull } + if$ + name.or.dash + format.book.title.edition output + format.series output + author empty$ + { skip$ } + { format.editors output } + if$ + use.ieej.setting #1 = + { format.publisher output } + { format.address.publisher.date output } + if$ + format.volume output + format.number output + format.note output + use.ieej.setting #0 = 'skip$ { format.date output } if$ + format.url output + bbl.format.language #2 = { format.language output } 'skip$ if$ + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {booklet} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {electronic} +{ std.status.using.period + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.date.electronic output + format.article.title.electronic output + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +} + +FUNCTION {inbook} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + author empty$ + { format.editors "author and editor" output.warn } + { format.authors output.nonnull } + if$ + name.or.dash + format.book.title.edition output + format.series output + use.ieej.setting #1 = + { format.publisher output } + { format.address.publisher.date output } + if$ + format.volume output + format.number output + format.chapter output + format.pages output + format.note output + use.ieej.setting #0 = 'skip$ { format.date output } if$ + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {incollection} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.in.booktitle.edition "booktitle" output.warn + format.series output + format.editors output + use.ieej.setting #1 = + { format.publisher output } + { format.address.publisher.date output } + if$ + format.volume output + format.number output + format.chapter output + format.pages output + format.note output + use.ieej.setting #0 = 'skip$ { format.date output } if$ + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {inproceedings} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + use.ieej.abbrev #1 = + { skip$ } + { format.article.title "title" output.warn } + if$ + format.in.booktitle "booktitle" output.warn + format.series output + format.editors output + format.volume output + format.number output + use.ieej.setting #1 = + { format.paper output + format.pages output + use.ieej.abbrev #1 = + { skip$ } + { format.address output } + if$ + } + { publisher empty$ + { format.address.organization.date output } + { format.organization "organization" bibinfo.check output + format.address.publisher.date output + } + if$ + format.paper output + format.pages output + } + if$ + format.note output + use.ieej.setting #0 = 'skip$ { format.date output } if$ + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {manual} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.book.title.edition "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {mastersthesis} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.master.thesis.type output.nonnull + format.school "school" bibinfo.warn output + format.address "address" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {misc} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title output + format.howpublished "howpublished" bibinfo.check output + format.organization "organization" bibinfo.check output + format.address "address" bibinfo.check output + format.pages output + format.date output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +} + +FUNCTION {patent} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.article.title output + format.patent.nationality.type.number output + format.patent.date output + format.note output + format.url output + fin.entry + empty.entry.warn + if.url.std.interword.spacing +} + +FUNCTION {periodical} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.editors output + name.or.dash + format.book.title "title" output.warn + format.series output + format.volume output + format.number output + format.organization "organization" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {phdthesis} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.phd.thesis.type output.nonnull + format.school "school" bibinfo.warn output + format.address "address" bibinfo.check output + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {proceedings} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.editors output + name.or.dash + format.book.title "title" output.warn + format.series output + format.volume output + format.number output + publisher empty$ + { format.address.organization.date output } + { format.organization "organization" bibinfo.check output + format.address.publisher.date output + } + if$ + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {standard} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors output + name.or.dash + format.book.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.organization.institution.standard.type.number output + format.revision output + format.date output + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {techreport} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.howpublished "howpublished" bibinfo.check output + format.institution "institution" bibinfo.warn output + format.address "address" bibinfo.check output + format.tech.report.number output.nonnull + format.date "year" output.warn + format.note output + format.url output + fin.entry + if.url.std.interword.spacing +} + +FUNCTION {unpublished} +{ std.status.using.comma + start.entry + if.url.alt.interword.spacing + format.authors "author" output.warn + name.or.dash + format.article.title "title" output.warn + format.date output + format.note "note" output.warn + format.url output + fin.entry + if.url.std.interword.spacing +} + + +% The special entry type which provides the user interface to the +% BST controls +FUNCTION {IEEEtranBSTCTL} +{ is.print.banners.to.terminal + { "** IEEEtran BST control entry " quote$ * cite$ * quote$ * " detected." * + top$ + } + { skip$ } + if$ + CTLuse_article_number + empty$ + { skip$ } + { CTLuse_article_number + yes.no.to.int + 'is.use.number.for.article := + } + if$ + CTLuse_paper + empty$ + { skip$ } + { CTLuse_paper + yes.no.to.int + 'is.use.paper := + } + if$ + CTLuse_url + empty$ + { skip$ } + { CTLuse_url + yes.no.to.int + 'is.use.url := + } + if$ + CTLuse_forced_etal + empty$ + { skip$ } + { CTLuse_forced_etal + yes.no.to.int + 'is.forced.et.al := + } + if$ + CTLmax_names_forced_etal + empty$ + { skip$ } + { CTLmax_names_forced_etal + string.to.integer + 'max.num.names.before.forced.et.al := + } + if$ + CTLnames_show_etal + empty$ + { skip$ } + { CTLnames_show_etal + string.to.integer + 'num.names.shown.with.forced.et.al := + } + if$ + CTLuse_alt_spacing + empty$ + { skip$ } + { CTLuse_alt_spacing + yes.no.to.int + 'is.use.alt.interword.spacing := + } + if$ + CTLalt_stretch_factor + empty$ + { skip$ } + { CTLalt_stretch_factor + 'ALTinterwordstretchfactor := + "\renewcommand{\BIBentryALTinterwordstretchfactor}{" + ALTinterwordstretchfactor * "}" * + write$ newline$ + } + if$ + CTLdash_repeated_names + empty$ + { skip$ } + { CTLdash_repeated_names + yes.no.to.int + 'is.dash.repeated.names := + } + if$ + CTLname_format_string + empty$ + { skip$ } + { CTLname_format_string + 'name.format.string := + } + if$ + CTLname_latex_cmd + empty$ + { skip$ } + { CTLname_latex_cmd + 'name.latex.cmd := + } + if$ + CTLname_url_prefix + missing$ + { skip$ } + { CTLname_url_prefix + 'name.url.prefix := + } + if$ + CTLuse_ieej_abbrev + empty$ + { skip$ } + { CTLuse_ieej_abbrev + yes.no.to.int + 'use.ieej.abbrev := + use.ieej.setting #1 = + { use.ieej.abbrev 'is.forced.et.al := } + { skip$ } + if$ + } + if$ + + num.names.shown.with.forced.et.al max.num.names.before.forced.et.al > + { "CTLnames_show_etal cannot be greater than CTLmax_names_forced_etal in " cite$ * warning$ + max.num.names.before.forced.et.al 'num.names.shown.with.forced.et.al := + } + { skip$ } + if$ +} + + +%%%%%%%%%%%%%%%%%%% +%% ENTRY ALIASES %% +%%%%%%%%%%%%%%%%%%% +FUNCTION {conference}{inproceedings} +FUNCTION {online}{electronic} +FUNCTION {internet}{electronic} +FUNCTION {webpage}{electronic} +FUNCTION {www}{electronic} +FUNCTION {default.type}{misc} + + + +%%%%%%%%%%%%%%%%%% +%% MAIN PROGRAM %% +%%%%%%%%%%%%%%%%%% + +READ + +EXECUTE {initialize.controls} +EXECUTE {initialize.status.constants} +EXECUTE {banner.message} + +EXECUTE {initialize.longest.label} +ITERATE {longest.label.pass} + +EXECUTE {begin.bib} +ITERATE {call.type$} +EXECUTE {end.bib} + +EXECUTE{completed.message} + + +%% That's all folks, mds. diff --git a/biblio/bibtex/contrib/jieeetran/jieeetran-en.pdf b/biblio/bibtex/contrib/jieeetran/jieeetran-en.pdf new file mode 100644 index 0000000000..bc619d10fb Binary files /dev/null and b/biblio/bibtex/contrib/jieeetran/jieeetran-en.pdf differ diff --git a/biblio/bibtex/contrib/jieeetran/jieeetran-en.tex b/biblio/bibtex/contrib/jieeetran/jieeetran-en.tex new file mode 100644 index 0000000000..606c18f330 --- /dev/null +++ b/biblio/bibtex/contrib/jieeetran/jieeetran-en.tex @@ -0,0 +1,86 @@ +\documentclass[11pt, a4paper, dvipdfmx]{article} + +\usepackage{bxtexlogo} + +\begin{filecontents}[overwrite]{library.bib} +@misc{IEEEtran, + author = {Michael Shell}, + url = {https://www.ctan.org/tex-archive/macros/latex/contrib/IEEEtran/bibtex}, + title = {{IEEEtran}}, + month = {August}, + year = {2015} +} +@misc{jIEEEtran, + author = {ehki}, + url = {https://github.com/ehki/jIEEEtran}, + title = {{jIEEEtran}}, + month = {March}, + year = {2020} +} +@misc{jeconbst, + author = {ShiroTakeda}, + url = {http://shirotakeda.org/ja/tex-ja/jecon-ja.html}, + title = {{jecon.bst}}, + month = {August}, + year = {2019} +} +\end{filecontents} + + +\title{\texttt{jIEEEtran.bst}:\\Unofficial IEEE \BibTeX\ style for Japanese\\(ver. 0.18)} +\author{Haruki EJIRI} + +\begin{document} + +\maketitle + +\begin{abstract} +The jIEEEtran \BibTeX\ style is an unofficial IEEE style citation format for Japanese users. +It is a customization of Michael Shell's IEEEtran.bst, and provides natural Japanese name handling. +A Python script named mixej.py enables one content with both English and Japanese format to be handled properly. +\end{abstract} + + +\section{Introduction} + +IEEJtran.bst is an unofficial \BibTeX-style (.bst) file in IEEJ format developed for Japanese users engaging in electrical engineering. +YoshiRi implemented natural Japanese notation based on Michael Shell's IEEEtran.bst[?]. +And now the author develops it in GitHub repository [?] after taking it over. +Please note jIEEEtran.bst is unofficial. +The author does not guarantee that it will work in all environments. +We cannot be held responsible for any problems that may occur. +We recommend platex/pbibtex or uplatex/upbibtex as \TeX\ engines. + + +\section{Configuration} + +If jIEEEtran.bst has been installed by \TeX\ Live package manager, etc., and placed under PATH, write \texttt{\string\bibliographystyle\string{jIEEEtran\string}} in the preamble to complete the setup. +In the case that jIEEEtran.bst is individually downloaded and placed in the same directory as the main \TeX\ file such a reason for customization, state \texttt{\string\bibliographystyle\string{jIEEEtran\string}} in the preamble in the same way to complete the setting. +In the .bib file containing bibliographic information, Japanese authors' names should be written as: +\begin{center} +\texttt{author = \string{\string{Yamada Taro\string} and \string{Sato Jiro\string}\string}}, +\end{center} +or +\begin{center} +\texttt{author = \string{Yamada, Taro and Sato, Jiro\string}}. +\end{center} + + +\section{Combine English and Japanese entries} + +Japanese users are sometimes required to write both English and Japanese citation formats as one bibliography entry. +A python script named \texttt{mixej.py} included in the \texttt{jieeetran} package enables combining English and Japanese entries. +To combine two entries of enkey and jpkey, users have to cite as \texttt{\string\cite\string{enkye/ej/jpkey\string}}, where enkey and jpkey are English and Japanese citation keys, respectively. +Then compile by the following seven steps: +\begin{center} + \texttt{uplatex → python mixej.py → upbibtex → python mixej.py\\→ uplatex → uplatex → dvipdfmx} +\end{center} +instead of the typical five steps: +\begin{center} + \texttt{uplatex → upbibtex → uplatex → uplatex → dvipdfmx}. +\end{center} +Note that the uplatex command is Unicode and Japanese compatible latex command. + +The Japanese version of this document, \texttt{jieeetran.pdf}, shows examples for English and Japanese combined citations. + +\end{document} diff --git a/biblio/bibtex/contrib/jieeetran/jieeetran.pdf b/biblio/bibtex/contrib/jieeetran/jieeetran.pdf new file mode 100644 index 0000000000..2e8f532b79 Binary files /dev/null and b/biblio/bibtex/contrib/jieeetran/jieeetran.pdf differ diff --git a/biblio/bibtex/contrib/jieeetran/jieeetran.tex b/biblio/bibtex/contrib/jieeetran/jieeetran.tex new file mode 100644 index 0000000000..454929a5b9 --- /dev/null +++ b/biblio/bibtex/contrib/jieeetran/jieeetran.tex @@ -0,0 +1,376 @@ +\documentclass[11pt, a4paper, dvipdfmx, uplatex]{jsarticle} +\bibliographystyle{jIEEEtran} + +\usepackage{listings, jlisting} +\lstdefinestyle{onecol}{ + basicstyle={\scriptsize\ttfamily}, + identifierstyle={\footnotesize}, + commentstyle={\footnotesizeitshape}, + keywordstyle={\footnotesize\bfseries}, + ndkeywordstyle={\footnotesize}, + stringstyle={\footnotesize\ttfamily}, + breaklines=true, + columns=[l]{fullflexible} +} + +\begin{filecontents}[overwrite]{library.bib} +@misc{IEEEtran, + author = {Michael Shell}, + url = {https://www.ctan.org/tex-archive/macros/latex/contrib/IEEEtran/bibtex}, + title = {{IEEEtran}}, + month = {August}, + year = {2015} +} +@misc{jIEEEtran, + author = {ehki}, + url = {https://github.com/ehki/jIEEEtran}, + title = {{jIEEEtran}}, + month = {March}, + year = {2020} +} +@misc{jeconbst, + author = {ShiroTakeda}, + url = {http://shirotakeda.org/ja/tex-ja/jecon-ja.html}, + title = {{jecon.bst}}, + month = {August}, + year = {2019} +} +@article{jpArticle1, + author = {山田 一郎 and 山田 次郎 and 山田 三郎 and 山田 四郎}, + year = {2019}, + journal = {日本語学会}, + title = {文献1}, + number = {10}, + pages = {20--30}, + volume = {15}, + month = {3} +} +@article{jpArticle2, + author = {{山田 五郎} and {山田 六郎}}, + year = {2019}, + journal = {日本語学会}, + title = {文献2}, + number = {10}, + pages = {21}, + volume = {15}, + month = {12} +} +@article{jpArticle3, + author = {{山田 八郎} and {山田 六郎}}, + year = {2010}, + journal = {日本語学会}, + title = {手法1と手法2の比較検討}, + number = {1}, + pages = {15}, + volume = {5} +} +@article{enArticle1, + author = {Ichiro Yamada and Jiro Yamada and Saburo Yamada and Shiro Yamada}, + year = {2019}, + journal = {Japanese Journal}, + title = {Title1}, + number = {10}, + pages = {20--30}, + volume = {15}, + month = {march}, + language = {Japanese} +} +@article{enArticle2, + author = {Goro Yamada and Rokuro Yamada}, + year = {2019}, + journal = {Japanese Journal}, + title = {Title2}, + volume = {15}, + number = {10}, + pages = {21}, + month = {dec.}, + language = {Japanese} +} +@article{enArticle3, + author = {Hachiro Yamada and Rokuro Yamada}, + year = {2010}, + journal = {Japanese Journal}, + title = {Comparison Between Method 1 and Method 2}, + number = {1}, + pages = {15}, + volume = {5} +} +@inproceedings{jpInproceedings1, + author = {山田, 一郎 and 山田, 次郎}, + title = {文献タイトル}, + booktitle = {令和2年日本語大会}, + address = {大阪}, + year = {2010}, + month = {3}, + number = {10}, + pages = {20--30} +} +@inproceedings{jpInproceedings2, + author = {山田, 三郎 and 佐藤, 四郎}, + title = {タイトル}, + booktitle = {第30回部門大会}, + address = {東京}, + year = {2005}, + month = {2}, + number = {2}, + pages = {15--19} +} +@inproceedings{enInproceedings1, + author = {Hayashi, Shinji and Ogura, Yasuhiro}, + title = {Sample Conference Article Title}, + booktitle = {Proc. 5th Internatinoal Sample Conference (ISC)}, + address = {Tokyo, Japan}, + month = {jan}, + year = {1997}, + pages = {290-294}, + number = {2} +} +@inproceedings{enInproceedings2, + author = {Yamada, Sabuso and Sato, Shiro}, + title = {Title}, + booktitle = {Proc. 30th Society Conference}, + address = {Tokyo}, + year = {2005}, + month = {2}, + number = {2}, + pages = {15--19}, + language = {Japanese} +} +@incollection{jpIncollection1, + author = {{佐藤 二郎} and {林 三郎}}, + year = {2012}, + publisher = {日本語出版}, + address = {東京}, + title = {日本語本2の中の抜粋}, + booktitle = {日本語本2}, + edition = {2}, + pages = {100--200} +} +@incollection{jpIncollection2, + author = {山田, 一郎}, + year = {1900}, + publisher = {出版会社}, + address = {東京}, + title = {タイトル}, + booktitle = {日本語本3}, + chapter = {3}, + edition = {1}, + pages = {100--150}, +} +@incollection{enIncollection1, + address = {Tokyo, Japan}, + publisher = {JP Press}, + author = {Sato, Jiro and Hayashi, Saburo}, + booktitle = {Jpbook2}, + title = {Part of Jpbook2}, + pages = {100--200}, + edition = {2}, + year = {2012}, +} +@book{jpBook1, + author = {佐藤, 一郎}, + year = {2010}, + publisher = {日本語出版}, + address = {東京}, + title = {日本語本}, + edition = {1}, + pages = {100--200} +} +@book{jpBook2, + author = {佐藤, 二郎 and 佐藤, 三郎}, + year = {2012}, + publisher = {日本語出版}, + address = {東京}, + title = {日本語本2}, + edition = {2}, + pages = {100--200} +} +@book{jpBook3, + author = {学会委員会}, + year = {2020}, + publisher = {学会出版}, + title = {学会本}, + edition = {1} +} +@book{enBook1, + address = {City, Country}, + publisher = {Publisher}, + author = {Sato, Jiro and Hayashi, Saburo}, + year = {2000}, + title = {Title, not booktitle}, + edition = {3}, + pages = {1-10}, +} +@book{enjBook1, + author = {Ichiro Sato}, + year = {2010}, + publisher = {Japanese Publisher}, + address = {Tokyo}, + title = {Japanese Book title}, + edition = {1}, + pages = {100--200}, + language = {japaneese} +} +@book{jpjBook1, + author = {佐藤 一郎}, + year = {2010}, + publisher = {日本語出版}, + address = {東京}, + title = {日本語本}, + edition = {1}, + pages = {100--200} +} +\end{filecontents} + + +\title{\texttt{jIEEEtran.bst}:\\日本語対応IEEE非公式\BibTeX スタイル\\(ver. 0.18)} +\author{江尻 開} + +\begin{document} + +\maketitle + +\begin{abstract} +jIEEEtranは日本人ユーザ向けに調整されたIEEE形式の非公式\BibTeX スタイルです。 +Michael Shell氏のIEEEtran.bstを基に、日本語著者の自然な姓名処理を実現します。 +一つのエントリに英語と日本語を併記可能とするPythonスクリプトmixej.pyも提供します。 +\end{abstract} + + +\section{はじめに} + +\texttt{jIEEEtran.bst}はIEEEの引用スタイルを保ったまま日本語の取り扱いを自然にした\BibTeX スタイル(\texttt{.bst})ファイルです。 +卒業論文や修士論文など,\LaTeX を使用した文献管理の一助になることを目的としています。 +Michael Shell氏による\texttt{IEEEtran.bst}\cite{IEEEtran}をもとにYoshiRi氏が日本語の自然な表記を実装し,現在は著者がリポジトリを譲渡していただきGitHub上\cite{jIEEEtran}で継続して開発しています。 +同レポジトリでは電気学会形式の非公式\BibTeX スタイルである\texttt{IEEJtran.bst}も取り扱っています。 +オプションの追記方法や日本語の判別方法については,武田氏らによる\texttt{jecon.bst}\cite{jeconbst}を参考にしています。 +\TeX Live 2019以降の使用を想定しています。 +\texttt{w32tex}や古い\TeX Liveでの動作は確認していません。 +\TeX エンジンとしてplatex/pbibtexもしくはuplatex/upbibtexを推奨し,本マニュアルはuplatexでコンパイルしています。 +\TeX エンジンが出力する中間ファイルの改変にPythonを使用します。 +Pythonは\texttt{3.7}以降での動作を確認しています。 + + +\section{使用方法} + +\texttt{jIEEEtran.bst}が\TeX Liveのパッケージマネージャ等でインストールされ,PATHの通った場所に配置されている場合,プリアンブルに\texttt{\string\bibliographystyle\string{jIEEEtran\string}}と記載すれば設定は完了です。 +後述のカスタマイズ等の目的で\texttt{jIEEEtran.bst}を個別にダウンロードして配置する場合,メインの\TeX ファイルと同じディレクトリに格納し,同様にプリアンブルに\texttt{\string\bibliographystyle\string{jIEEEtran\string}}と記載すれば設定は完了です。 + +文献情報が記載される\texttt{.bib}ファイル上では,日本人著者は +\begin{center} + \texttt{author = \string{\string{\textgt{姓姓 名名}\string} and \string{\textgt{姓姓 名名}\string}\string}} +\end{center} +と,\texttt{\string{\string}}で挟むか, +\begin{center} + \texttt{author = \string{姓姓, 名名 and 姓姓, 名名\string}} +\end{center} +と,\texttt{\string{\string}}で挟まず半角カンマを挿入して記入してください。 + + +\section{カスタマイズ} +\texttt{jIEEEtran}はテキストファイルである\texttt{jIEEEtran.bst}を直接変更することでカスタマイズが可能です。 +例えば、IEEE形式では同一著者の文献が連続した場合に著者名を長ダッシュで代用しますが、この処理を行いたくない場合、\texttt{jIEEEtran.bst}の +\begin{center} + \texttt{FUNCTION \string{default.is.dash.repeated.names.ieee\string} \string{ \#1 \string}} +\end{center} +を +\begin{center} + \texttt{FUNCTION \string{default.is.dash.repeated.names.ieee\string} \string{ \#0 \string}} +\end{center} +に変更します。 +他の設定項目は\texttt{jIEEEtran.bst}を直接ご確認ください。 + + +\section{英語と日本語の併記方法} + +電気学会の引用スタイルで求められているように,一つの文献エントリに英語と日本語の情報を併記する場合,\texttt{.tex}ファイルには次のように記載してください。 +\begin{center} + \texttt{\string\cite\string{enArticle1/ej/jpArticle1\string}} +\end{center} +加えて,外部pythonファイルの\texttt{mixej.py}を用いて\texttt{.aux}ファイルと\texttt{.bbl}ファイルを改変する必要があります。 +具体的には,\BibTeX コマンドの実行前に\texttt{enArticle1/ej/jpArticle1\string}を\texttt{enArticle1}と\texttt{jpArticle1}の2つのエントリに分け,\BibTeX コマンドが文献情報を書き出した後に再度結合させる操作を行います。 + + +\subsection{コンパイル手順} + +英語と日本語の併記を行わない場合,通常通りのコンパイル手順で\texttt{.pdf}を生成することができます。 +例えば\texttt{uplatex}で\texttt{.dvi}を生成し,\texttt{.dvi}から\texttt{.pdf}を生成,\BibTeX コマンドには\texttt{upbibtex}を使う場合, +\begin{center} +\texttt{uplatex → upbibtex → uplatex → uplatex → dvipdfmx} +\end{center} +という手順です。 + +英語と日本語の併記を行う場合,通常のコンパイル手順での\texttt{upbibtex}前後に\texttt{python}による\texttt{mixej.py}の処理を一回ずつ挟みます。 +前と同様に,\texttt{uplatex}で\texttt{.dvi}を生成し,\texttt{.dvi}から\texttt{.pdf}を生成,\BibTeX コマンドには\texttt{upbibtex}を使う場合, +\begin{center} +\texttt{uplatex → python mixej.py → upbibtex → python mixej.py\\→ uplatex → uplatex → dvipdfmx} +\end{center} +という手順に変更されます。 + + +\subsection{コンパイラの設定の例} + +Latexmkを使用している場合,MacやLinuxなどのUNIX系列では\texttt{.latexmkrc}に対して次のように設定することで実現可能です。 + +\noindent\makebox[\linewidth]{\rule{\linewidth}{0.4pt}}\vspace{-0.5zw} +\begin{lstlisting}[style=onecol] +#!/usr/bin/perl + +$latex = 'uplatex %O -synctex=1 -interaction=nonstopmode -kanji=utf8 -file-line-error %S'; +$bibtex = 'python mixej.py %B; upbibtex %O %B; python mixej.py %B'; +$dvipdf = 'dvipdfmx -V 7 %O -o %D %S'; +$pdf_previewer = "open -ga /Applications/Skim.app"; +\end{lstlisting}\vspace{-1.8zw} +\noindent\makebox[\linewidth]{\rule{\linewidth}{0.4pt}}\vspace{0.5zw}\par + +\noindent +Windowsでは,cmd, powershellともに\texttt{bibtex}の設定を次のようにすれば動きます。ただし,\texttt{\&}前後の半角スペースを忘れずに記入してください。 + +\noindent\makebox[\linewidth]{\rule{\linewidth}{0.4pt}}\vspace{-0.5zw} +\begin{lstlisting}[style=onecol] +$bibtex = '@cd & python mixej.py %B & upbibtex %B & python mixej.py %B'; +\end{lstlisting}\vspace{-1.8zw} +\noindent\makebox[\linewidth]{\rule{\linewidth}{0.4pt}}\vspace{0.5zw}\par + + +最近ではVisual Studio Codeを使用している方が多いと思いますが,MacやLinuxでのVSCodeのLaTeX Workshop Extension用の設定は次のように書けます。Windowsの場合は\texttt{.latexmkrc}の場合と同様に\texttt{bibtex}コマンドを書き換えてください。 + +\noindent\makebox[\linewidth]{\rule{\linewidth}{0.4pt}}\vspace{-0.5zw} +\begin{lstlisting}[style=onecol] +"latex-workshop.latex.tools": [ + { + "command": "latexmk", + "name": "latexmk uplatex/upbibtex/mixej", + "args": [ + "-e", "$latex='uplatex %O -synctex=1 -interaction=nonstopmode -kanji=utf8 -file-line-error %S'", + "-e", "$bibtex='python mixej.py %B; upbibtex %O %B; python mixej.py %B'", + "-e", "$dvipdf='dvipdfmx -V 7 %O -o %D %S'", + "-norc", "-pdfdvi", "%DOC%" + ], + } +], +"latex-workshop.latex.recipes": [ + { "name": "latexmk uplatex/upbibtex/mixej", "tools": [ "latexmk uplatex/upbibtex/mixej" ] } +], +\end{lstlisting}\vspace{-1.8zw} +\noindent\makebox[\linewidth]{\rule{\linewidth}{0.4pt}}\vspace{0.5zw}\par + + +\subsection{引用例} + +いくつかの引用例を示します。 +英語Articleの例\cite{enArticle1}。 +日本語Articleの例\cite{jpArticle1}。 +英語と日本語を併記したArticleの例\cite{enArticle2/ej/jpArticle2,enArticle3/ej/jpArticle3}。 +英語Inproceedingsの例\cite{enInproceedings1}。 +日本語Inproceedingsの例\cite{jpInproceedings1}。 +英語と日本語を併記したInproceedingsの例\cite{enInproceedings2/ej/jpInproceedings2}。 +英語Incollectionの例\cite{enIncollection1}。 +日本語Incollectionの例\cite{jpIncollection1,jpIncollection2}。 +英語Bookの例\cite{enBook1}。 +日本語Bookの例\cite{jpBook1,jpBook2,jpBook3}。 +英語と日本語を併記したBookの例\cite{enjBook1/ej/jpjBook1}。 + +\bibliography{library.bib} + +\end{document} diff --git a/biblio/bibtex/contrib/jieeetran/mixej.py b/biblio/bibtex/contrib/jieeetran/mixej.py new file mode 100644 index 0000000000..f96dbf6f48 --- /dev/null +++ b/biblio/bibtex/contrib/jieeetran/mixej.py @@ -0,0 +1,486 @@ +import sys +import platform +import json +import logging + + +SPLIT_KEY = '/ej/' +ITEM_SEP = '\\hspace{0mm}\\\\' + +FILE_VERSION = '0.18' +FILE_DATE = '2022/03/26' +FILE_AUTHOR = 'Haruki Ejiri' +FILE_URL = 'https://github.com/ehki/jIEEEtran/' + +logger = logging.getLogger(__name__) + + +def check_load_file(fn, asjson=False): + """load file if exist else return -1. + + This code load text and json file if exist. + If the file not exist, return -1 + + Parameters + ---------- + fn : str + Path to the file to load + asjson : bool + whether the fn should be loaded using json or normal text file + + Returns + ------- + int + 0 if success + """ + + logger.info('-- Checking file %s, ' % fn) + try: + with open(fn, 'r', encoding='utf-8') as f: + logger.info('exist, load.') + if asjson: + return json.load(f) + else: + return f.read() + except FileNotFoundError: + logger.info('not found.') + return -1 + + +def save_pairs(fn, pairs): + """save pairs to the JSON format file with the extensions of ".ejp". + + This code save the pairs to the file in JSON format. + + Parameters + ---------- + fn : str + Path to the file to write pairs + pairs : list of two strings + for example: [["en1", "jp1"], ["en2", "jp2"], ["en3", "jp3"]] + + Returns + ------- + int + 0 if success + """ + + logger.info('-- Saving found pairs to %s, ' % fn) + with open(fn, 'w', encoding='utf-8') as f: + json.dump(pairs, f) + logger.info('done.') + return 0 + + +def divide_aux(fn, pairs): + """divide comined citation(s) and bibcite(s) in aux file. + + This code divide the combined key(s) in aux file. + For example, the following citation(s) and bibcite(s) in aux file + -- + \\citation{englishTest7/ej/japaneseTest7} + + \\bibcite{englishTest7/ej/japaneseTest7}{16} + -- + will be converted to the following two divided citations and bibitems. + -- + \\citation{englishTest7,japaneseTest7} + + \\bibcite{englishTest7,japaneseTest7}{16} + -- + + Parameters + ---------- + fn : str + Path to the aux file to proceess + pairs : list of two strings + for example: [["en1", "jp1"], ["en2", "jp2"], ["en3", "jp3"]] + + Returns + ------- + int + -1 if the file to process not found, 0 if success + """ + + aux = check_load_file(fn) + if aux == -1: # file not found + return -1 # failed + for k1, k2 in pairs: + combi = SPLIT_KEY.join([k1, k2]) + # for example, combi is "engkey/ej/jpkey", wehere SPLIT_KEY is "/ej/" + logger.info('-- Dividing %s into %s and %s' % (combi, k1, k2)) + aux = aux.replace('%s' % combi, + '%s,%s' % (k1, k2)) + with open(fn, 'w', encoding='utf-8') as f: + f.write(aux) + return 0 + + +def divide_bbl(fn, pairs): + """divide comined bibitem(s) in bbl file. + + This code divide the combined key(s) in bbl file. + For example, the following combined bibitem(s) in bbl file + -- + \\bibitem{englishTest5/ej/japaneseTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3)\\hspace{0mm}\\\\ + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + will be converted to the following two divided bibitems. + -- + \\bibitem{englishTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3) + + \\bibitem{japaneseTest5} + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + + Parameters + ---------- + fn : str + Path to the bbl file to proceess + pairs : list of two strings + for example: [["en1", "jp1"], ["en2", "jp2"], ["en3", "jp3"]] + + Returns + ------- + int + -1 if the file to process not found, 0 if success + """ + + bbl = check_load_file(fn) + if bbl == -1: # file not found + return -1 # failed + for k1, k2 in pairs: + combi = SPLIT_KEY.join([k1, k2]) + # for example, combi is "engkey/ej/jpkey", wehere SPLIT_KEY is "/ej/" + logger.info('-- Dividing %s into %s and %s' % (combi, k1, k2)) + bbl = bbl.replace(ITEM_SEP, '\n\n\\bibitem{%s}' % k2) + bbl = bbl.replace('\\bibitem{%s}' % combi, '\\bibitem{%s}' % k1) + logger.info('-- Saving divided bbl to %s, ' % fn) + with open(fn, 'w', encoding='utf-8') as f: + f.write(bbl) + logger.info('done.') + return 0 # successfully finished + + +def find_pairs(fn, aux): + """find english/japanese pair from string in aux. + + This code find and store english/japanese pair. + Reading each line in aux strings, the engligh and japanese keys + are extracted if SPLIT_KEY is in the line. + If the combined english/japanese keys in the aux file, + the pairs are stored to the external JSON file + + Parameters + ---------- + fn : str + Path to the aux file to proceess + aux : strings in aux file + loaded string + + Returns + ------- + int + 0 if no combined keys found + num-of-pairs if successfully processed + """ + + pairs = [] + logger.info('-- ') + for line in aux.split('\n'): + if SPLIT_KEY not in line or '\\citation' not in line: + continue + # the line contains \citation and /ej/ + for ln in line.replace('\\citation{', '').replace('}', '').split(','): + # convert '\citation{hoge1/ej/hoge2}' to 'hoge1/ej/hoge2' + if len(ln.split(SPLIT_KEY)) == 2: + pairs.append(ln.split(SPLIT_KEY)) + # store as ['hoge1', 'hoge2'] pairs + logger.info('%s' % str(ln.split(SPLIT_KEY))) + if len(pairs) == 0: + logger.info('No combined keys found.') + ret = 0 + if len(pairs) > 0: + logger.info(' %d combined keys found.' % len(pairs)) + ret = pairs + save_pairs(fn, pairs) + return ret + + +def combine_aux(fn, pairs): + """combine divided citation(s) and bibcite(s) in aux file. + + This code combine the divided key(s) in aux file. + For example, the following two divided citation(s) and bibcite(s) + in aux file + -- + \\citation{englishTest7,japaneseTest7} + + \\bibcite{englishTest7,japaneseTest7}{16} + -- + will be converted to the following combined citations and bibitems. + -- + \\citation{englishTest7/ej/japaneseTest7} + + \\bibcite{englishTest7/ej/japaneseTest7}{16} + -- + + Parameters + ---------- + fn : str + Path to the aux file to proceess + pairs : list of two strings + for example: [["en1", "jp1"], ["en2", "jp2"], ["en3", "jp3"]] + + Returns + ------- + int + -1 if the file to process not found, 0 if success + """ + + aux = check_load_file(fn) + if aux == -1: # file not found + return -1 # failed + for k1, k2 in pairs: + combi = SPLIT_KEY.join([k1, k2]) + # for example, combi is "engkey/ej/jpkey", wehere SPLIT_KEY is "/ej/" + logger.info('-- Combining %s and %s to %s' % (k1, k2, combi)) + aux = aux.replace('%s,%s' % (k1, k2), '%s' % combi) + logger.info('-- Saving combined aux to %s, ' % fn) + with open(fn, 'w', encoding='utf-8') as f: + f.write(aux) + logger.info('done.') + + +def combine_bbl(fn, pairs): + """combine divided bibitem(s) in bbl file. + + This code divide the combined key(s) in bbl file. + For example, the following two divided bibitem(s) in bbl file + -- + \\bibitem{englishTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3) + + \\bibitem{japaneseTest5} + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + will be converted to the following combined citations and bibitems. + -- + \\bibitem{englishTest5/ej/japaneseTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3)\\hspace{0mm}\\\\ + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + + Parameters + ---------- + fn : str + Path to the aux file to proceess + pairs : list of two strings + for example: [["en1", "jp1"], ["en2", "jp2"], ["en3", "jp3"]] + + Returns + ------- + int + -1 if the file to process not found, 0 if success + """ + + bbl = check_load_file(fn) + if bbl == -1: # file not found + return -1 # failed + for k1, k2 in pairs: + combi = SPLIT_KEY.join([k1, k2]) + # for example, combi is "engkey/ej/jpkey", wehere SPLIT_KEY is "/ej/" + logger.info('-- Combining %s and %s to %s' % (k1, k2, combi)) + bbl = bbl.replace('\n\n\\bibitem{%s}' % k2, ITEM_SEP) + bbl = bbl.replace('\\bibitem{%s}' % k1, + '\\bibitem{%s}' % combi) + logger.info('-- Saving combined bbl to %s, ' % fn) + with open(fn, 'w', encoding='utf-8') as f: + f.write(bbl) + logger.info('done.') + + +def divide_ej_key(bn): + """divide combined english and japanese bibiteems in bbl and aux file. + + This code divide the combined key(s) in aux and bbl file. + For example, the following combined bibitem(s) in bbl file + -- + \\bibitem{englishTest5/ej/japaneseTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3)\\hspace{0mm}\\\\ + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + will be converted to the following two divided bibitems. + -- + \\bibitem{englishTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3) + + \\bibitem{japaneseTest5} + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + The following two combined citation(s) and bibcite(s) in aux file + -- + \\citation{englishTest7/ej/japaneseTest7} + + \\bibcite{englishTest7/ej/japaneseTest7}{16} + -- + will also be converted to the following combined citations and bibitems. + -- + \\citation{englishTest7} + \\citation{japaneseTest7} + + \\bibcite{englishTest7}{1} + \\bibcite{japaneseTest7}{16} + -- + The first process during LaTeX compile, there would no bbl file. + If the bbl file not exist, the dividing process would be skipped. + A list of english/japanese pairs will be extracted from aux file, + and if will be saved in the JSON file with + ".ejp" (english-japanese-pair) extension + + Parameters + ---------- + bn : str + Target file to process without extension. + if your target tex file is '/DIRNAME/main.tex' + the bn would be '/DIRNAME/main' + + Returns + ------- + int + -1 if the file to process not found + 0 if no combined keys found + num-of-pairs if successfully processed + """ + + logger.info('--') + logger.info('-- Dividing combinecd keys.') + aux = check_load_file(bn + '.aux') + if aux == -1: # aux file not found + return -1 # abort + logger.info('-- Search combined keys from %s.aux.' % bn) + pairs = find_pairs(bn + '.ejp', aux) + if pairs == 0: # no combined keys + return 0 # probably already divided + divide_aux(bn + '.aux', pairs) + divide_bbl(bn + '.bbl', pairs) + return len(pairs) + + +def combine_ej_key(bn): + """combine english and japanese bibiteems in bbl and aux file. + + This code combine the divided key(s) in aux and bbl file. + For example, the following divided bibitem(s) in bbl file + -- + \\bibitem{englishTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3) + + \\bibitem{japaneseTest5} + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + will be converted to the following two divided bibitems. + -- + \\bibitem{englishTest5/ej/japaneseTest5} + I.~Yamada, J.~Sato, S.~Tanaka, S.~Suzuki: ``Article title'', Japanese + Transaction, Vol.10, No.5, pp.45--60 (2016-3)\\hspace{0mm}\\\\ + 山田~一郎・佐藤~次郎・田中~三郎・鈴木~四郎:「文献タイトル」, + 日本語学会,Vol.10,No.5,pp.45--60(2016-3) + -- + The following two divided citation(s) and bibcite(s) in aux file + -- + \\citation{englishTest7} + \\citation{japaneseTest7} + + \\bibcite{englishTest7}{1} + \\bibcite{japaneseTest7}{16} + -- + will also be converted to the following combined citations and bibitems. + -- + \\citation{englishTest7/ej/japaneseTest7} + + \\bibcite{englishTest7/ej/japaneseTest7}{16} + -- + + Parameters + ---------- + bn : str + Target file to process without extension. + if your target tex file is '/DIRNAME/main.tex' + the bn would be '/DIRNAME/main' + + Returns + ------- + int + -1 if the file to process not found + 0 if no combined keys found + num-of-pairs if successfully processed + """ + + logger.info('--') + logger.info('-- Combining divided keys.') + pairs = check_load_file(bn + '.ejp', asjson=True) + if pairs == -1: # file not found + return -1 + if len(pairs) == 0: # no combined keys + return 0 + combine_aux(bn + '.aux', pairs) + combine_bbl(bn + '.bbl', pairs) + return len(pairs) + + +if __name__ == '__main__': + + logger = logging.getLogger() + logger.setLevel(logging.INFO) + + sh = logging.StreamHandler() + logger.addHandler(sh) + + logger.info( + 'This is python version %s ' % platform.python_version()) + logger.info( + 'mixje.py version %s (%s) by %s.' % + (FILE_VERSION, FILE_DATE, FILE_AUTHOR) + ) + logger.info('See web site: %s' % FILE_URL) + try: + fname = sys.argv[1] + logger.info('Target: %s' % fname) + except IndexError: + logger.info('Fatal error: You must assign target.') + sys.exit(0) + + sk = divide_ej_key(fname) + if sk > 0: # combined keys existed + logger.info('-- Fin, %d keys were divided.' % sk) + sys.exit(0) + elif sk < 0: # Abort + sys.exit(0) + + ck = combine_ej_key(fname) + if ck != 0: + # print('-- %d divided citation keys were successfully combined' % ck) + logger.info('-- Fin, %d keys were combined.' % ck) + sys.exit(0) + with open(sys.argv[1] + '.ejp', 'w', encoding='utf-8') as f: + json.dump([], f) + logger.info( + '-- No cmobined nor divided citation key in the aux file') + sys.exit(0) -- cgit v1.2.3