英語論文の論文題目(タイトル)の各単語の1文字目を前置詞を除き、自動的に大文字にしたい

英語論文の論文題目(タイトル)の各単語の1文字目を前置詞を除き、自動的に大文字にしたい

- hhh kkk の投稿
返信数: 7

英語論文の論文題名(タイトル)の各単語の1文字目を前置詞を除き、
自動的に大文字にすることを考えています。

試しに作成したbstファイルの関連箇所は以下のようなものですが、
希望どおりには動作せず、論文題名がtitleエントリーに入力したまま表示されます。

希望の動作を行うようにするにはどうすればいいか、教えていただけませんでしょうか?

--------------------------

% 前置詞判定
FUNCTION {is.preposition}

  duplicate$ "of" = swap$
  duplicate$ "in" = or swap$
  duplicate$ "on" = or swap$
  duplicate$ "at" = or swap$
  duplicate$ "for" = or swap$
  duplicate$ "and" = or swap$
  duplicate$ "or" = or swap$
  duplicate$ "the" = or swap$
  duplicate$ "a" = or swap$
  duplicate$ "an" = or
}

% 先頭1文字大文字化 + 残りは小文字のまま
FUNCTION {capitalize.word}
{
  's :=
  s empty$
    { "" }
    {
      s #1 text.prefix$ "t" change.case$
      s text.length$ #2 <
        { "" }
        { s #2 global.max$ substring$ }
      if$
      *
    }
  if$
}

% 前置詞なら小文字化(全体をlowercase)
FUNCTION {lowercase.word}
{
  "l" change.case$
}

% タイトル大文字化処理(前置詞除外)
FUNCTION {capitalize.title}
{
  't :=            % 残りの文字列
  "" 'result :=    % 蓄積
  #1 'firstword := % 最初の単語フラグ

  { t "" = not }   % ループ条件
  {
    t " " split$   % left right
    't :=          % 残り
    'word :=       % 単語

    word empty$
      { }
      {
        firstword #1 =
          { word capitalize.word 'firstword := #0 'firstword := }
          {
            word is.preposition
              { word lowercase.word }
              { word capitalize.word }
            if$
          }
        if$

        result empty$
          { 'result := }
          { result " " * swap$ * 'result := }
        if$
      }
    if$
  }
  while$

  result
}

FUNCTION {format.title}
{ title empty$
    { "\textcolor{red}{title missing}" }
    { title capitalize.title}
  if$
}

----------------------------------------------

hhh kkk への返信

Re: 英語論文の論文題目(タイトル)の各単語の1文字目を前置詞を除き、自動的に大文字にしたい

- はやて (h20y6m) の投稿
最小限の動作する例を提供いただくことは可能でしょうか?
質問に書かれた内容だけでは動作させることが困難です。

---------

いくつか怪しいところを挙げておきます。

1) captalize.title

        { word capitalize.word 'firstword := #0 'firstword := }

は意図通りの記述でしょうか? capitalize.word の結果が firstword に代入された後 firstword に#0 が代入され残らないように見えます。

2) is.preposition
この関数はスタックの先頭が前置詞かどうかを調べ結果をスタックにプッシュするようですが、対象の文字列はスタックからポップされずに残ります。
この手の関数は引数に相当するスタックの要素をポップするものが多いと思いますが、この関数を使っている側は文字列がスタックに残ることを想定したコードになっていますか?

3) capitlize.word

"t" change.case$

は一文字の文字列だと何もしない??
はやて (h20y6m) への返信

Re: 英語論文の論文題目(タイトル)の各単語の1文字目を前置詞を除き、自動的に大文字にしたい

- はやて (h20y6m) の投稿
> "t" change.case$
>
> は一文字の文字列だと何もしない??

これは私の勘違いです。"t" change.case$ の仕様は「文字列の先頭とコロンの後以外を小文字にする」です。先頭を大文字にするのではありません。
"u" change.case$ が期待するもだと思います。
はやて (h20y6m) への返信

Re: 英語論文の論文題目(タイトル)の各単語の1文字目を前置詞を除き、自動的に大文字にしたい

- hhh kkk の投稿
はやて様
>"u" change.case$ が期待するもだと思います。
はい、その通りでした。
はやて (h20y6m) への返信

Re: 英語論文の論文題目(タイトル)の各単語の1文字目を前置詞を除き、自動的に大文字にしたい

- hhh kkk の投稿
はやて様
-----
1) captalize.title
{ word capitalize.word 'firstword := #0 'firstword := }
は意図通りの記述でしょうか? capitalize.word の結果が firstword に代入された後 firstword に#0 が代入され残らないように見えます。
--------------------------
この部分ですが、
----------------
firstword #1 =
{ word capitalize.word %大文字化
#0 'firstword := % firstwordのフラグを0にし、以降、firstwordが1(最初の単語)のときの処理をしない
}
------------------
firstword が1(最初の単語)のとき、大文字化し、
その後、firstwordのフラグを0にリセットし、以降、firstwordが1(最初の単語)のときの処理をしない
ことを意図しておりました。
hhh kkk への返信

Re: 英語論文の論文題目(タイトル)の各単語の1文字目を前置詞を除き、自動的に大文字にしたい

- hhh kkk の投稿
いろいろ調べたところ、最初に質問したときに示したコード内で使用しているsplit$というビルドイン関数そのものが実在しないことが分かりました。
-----------------------------
t " " split$ % left right
't := % 残り
'word := % 単語
-----------------------------
コードはChatGPTにプロント入力して作成させたもので、どうやら他の言語に存在する、単語を空白で区切る関数がbstにも存在するとChatGPTが勘違いしてコードを出力したようです。
ということで、そもそも質問したコードでは動作しないことが判明しました。
split$関数相当を自分で作成しない限り、無理っぽいです。
-----------------------------
hhh kkk への返信

Re: 英語論文の論文題目(タイトル)の各単語の1文字目を前置詞を除き、自動的に大文字にしたい

- 北見 けん の投稿
「コードはChatGPTにプロント入力して作成させた」というのは最初に書いておいた方が良いのじゃないかと思います。
質問者が自身で書いたコードであれば、回答する側が質問者にどこがどうマズいのかを説明して元のコードを生かした検討をすることは大いに意味を持ちますが、AIに書かせただけのものなのであれば、そんな手間をかけずにまったく新しく書き起こしたりしてもよかったりするわけなので。
北見 けん への返信

Re: 英語論文の論文題目(タイトル)の各単語の1文字目を前置詞を除き、自動的に大文字にしたい

- 和田 勇 の投稿

私の技術能力範囲外なので防寒しておりました。

さて、以前当フォーラムで .bib ファイルについて ついての話題で Re: .bib ファイルについて2023年 08月 15日(火曜日) 13:46 - 奥村 晴彦 の投稿 の記事にある Springer Nature がテンプレート用に用意している sn-mathphys-ay.bstやsn-mathphys-num.bst を利用したところ、題目の要件は達成できるようです。

ですので、流用するなりして参考にしていてはいかがでしょうか?

またインターネット検索してみたところ bst file how to split sub-strings separated with commas into an item なども参考になるかと思います。

それと、 .bst というか bib 処理する際に自動でと言うのも一つの正解ですが、 .bib ファイル自体を perl ruby python などで事前に補正ないし調整しておくのも ありだと思います。 perl だったら 基本は's/(.)(.*)/\U$1\L$2/' な感じかな。

以上、あまり精査していないのですが、情報提供まで。

そうそう、他の方もおっしゃっていますが、最低限の再現ソースを提供していただけると、 当フォーラムを購読している人の 何人かは、実験?検証してくれますので、解決方法が見つかるかもしれないので是非ご検討を!!