英語pdfからの改行除去&翻訳をzsh+Automatorでショートカットから呼び出す

# はじめに
pdf形式の英語論文を翻訳する際，本文をコピーすると改行が入り，DeepLにペーストしても同じ内容を繰り返したり一部が翻訳されなかったり，というストレスは多いのではないのでしょうか．
takanotume24さんのpaper tlanslation helperで文章を整えてからDeepLに渡すとある程度快適にはなったものの，論文とhelperとテキストエディタで3窓開きながらマウスをせわしなく動かして翻訳を進めていました．

https://takanotume24.github.io/paper-translation-helper/

MacにはAutomatorというアプリケーションが存在し，Apple scriptやshell scriptを用いた簡単なマクロを作成したり，右クリックで現れるコンテキストメニューに新しい項目を追加したり，キーボードショートカットで呼び出せるようにできるので，こいつを使ってショトカ1つでこれらのプロセスをまとめてしまいましょう．

ほとんどzsh上で処理できるのでシェルの呼び出し部分をうまく設定できれば他のOSでも動くと思います．

# 手順
1. DeepLのAPI keyを取得(無料) 
    https://www.deepl.com/ja/pro#developer

1. Automatorで新規クイックアクションを作成
2. ワークフローが受け取る項目：入力なし，検索対象：すべてのアプリケーション
2. シェルスクリプトを実行 を追加
2. シェル：zsh
2. 次のスクリプトをコピペ（API_KEYは差し替える）

    ```zsh:paper_translation.sh
    #!/bin/zsh
    export LC_CTYPE="UTF-8"
    apikey="YOUR_API_KEY"
    
    function format_text() {
        local text="$1"
    
        if [[ -z "$text" ]]; then
            echo '""'
            return
        fi
    
        text=${text//$'-\n'/""}
        text=${text//$'\n'/" "}
        text=${text//- /""}
        text=${text//\\u00AD\\n/""}
        text=${text//\\u00AD /""}
    	# 文中の(Author Name et al., year; ...)を削除
        text=$(echo "$text" | perl -pe '
        s{
            (?<=^|\s|\S)           # 文頭、空白、または非空白文字に続く
            \(                      # 開き括弧
            [^()]*?                 # 括弧以外の任意の文字（非貪欲）
            ,?\s*\d{4}              # カンマと空白に続く4桁の年度
            [^()]*                  # 年度の後に続く任意の文字（括弧以外、0文字以上）
            \)                      # 閉じ括弧
            (?=\s|\S)(?!\.)         # 閉じ括弧の後がピリオド以外のすべての文字（空白、非空白）
        }{ }gx                      # 単一の空白で置換
        ')
        text=${text// ,/,}
    
        echo "$text"
    }
    
    
    INPUT_TEXT="$(pbpaste)"
    FORMAT_TEXT="$(format_text "$INPUT_TEXT")"
    result=$(curl -s https://api-free.deepl.com/v2/translate \
        -X POST\
        -H "Content-Type: application/x-www-form-urlencoded" \
        -d "auth_key=${apikey}" \
        -d "text=${FORMAT_TEXT}" \
        -d "target_lang=ja")
    
    # jqがあるならこっちのほうが安定
    # translation=$(echo "$result" | jq -r '.translations[0].text')
    
    # jqの代用
    text=$(echo "$result" | grep -o '"text":"[^"]*"' )
    text=${text#'"text":"'}
    translation=${text%'"'}
    
    echo "$translation" | pbcopy
    # Apple scriptを呼び出して完了通知を表示，翻訳のラグが気になる場合
    # osascript -e 'display notification "" with title "翻訳が完了"'
    
    ```
2. ~/Library/Services/paper_translate.workflow として保存
2. システム環境設定 > キーボード > キーボードショートカット > サービス > 一般 > paper_translateと進み，ショトカを割り当て

<!--
~~クイックアクションはショトカを割り当てなくても右クリックのコンテキストメニューから実行できますが，階層も深くて面倒．~~
-->
# 注意

Automatorのクイックアクションは「すべてのアプリケーション」に設定しても実行できるアプリケーションが限られているよう（右クリックしたときのメニューが独自に設定されているようなアプリでは動かなそう）で，ショトカも同様のよう．

標準プレビューとかなら問題ないと思いますが，使い方としては，
1. pdfビュアーから本文をコピー(数式や改ページを挟む場合は手作業で整える)
1. テキストエディタ（他メモ，notionは動作確認済み) をアクティブに
1. ショトカを実行
1. ペースト

クイックアクションは「選択したテキスト」を入力として受け取ってシェルにstdinとして与えることもでき，コピーから翻訳までワンボタンで完了ということもできますが，前述の理由で汎用性が落ちるのと，定型処理はしているとはいえエディタで英文を修正してから翻訳に回したいときもあるのでこんな感じに．

テキストの前処理のパターンははじめに紹介したtakanotume24さんのリポジトリを参考に最低限必要そうなものの抽出とDeepLの苦手な部分に合わせて少し追加しています．
本スクリプトではpbcopy, pbpasteを使用していますがMac以外の環境では使えないそうなので適宜変換してください．


chatGPTのAPIが使えるなら数式とかもまとめて処理できるかもしれません．