【PC入門】.commandファイルを作ろう!!

:::note alart
記事の内容は学生個人の見解であり，所属している団体や大学機関の意見を代表するものではありません．
:::

どうも！理学部化学科に所属するyです．現在はこの団体のx(旧Twitter)の対応をしています.　アドベントカレンダーも6日目となりました.　3日坊主とならずに6日目までくれば一安心ですね！   
最近の僕が悩みは物理が難しいことです．量子力学って難しいですね．．．最近はjjサクライを買い感動しています．  
という事で，何事もまず形から入る私は今回pdf変換時にコマンドを検索したくないという動機でterminal上で対話形式で動く変換スクリプトを作りたいと思い，初心者がcommandファイルを作る過程を記事にしました．  ．  
初心者のスクリプト入門となるように組み方を残します！！   


:::alart 
この記事に関してはzsh(macなどで使われている)での動作を前提としています．
また，texのコマンドを使用しているため，[アドベントカレンダー4日目](https://qiita.com/nao159635741251/items/ea5c33fd28bf29a38c3a)を参考にtexを導入された方はぜひお使いください！
:::
# commandファイルとは  
みなさんcommandファイル(batファイル)をよく知らないと思うのでどのようなことができるのかを軽く説明しようと思います．今回私が作ったものは指定されたPDFファイルを加工するための自動化ツールです．  
このツールでは対話的に相手にterminal上で質問しながら実際に作りたいpdfをコマンドをいちいち参照することなく生成するためのツールとなっています．以下の内容を順番に聞いてfileを作ります．


### 今回作るスクリプトの内容
>PDFファイルの確認: 指定したPDFファイルが存在するかを確認.  
縦横レイアウトの調整: PDFの向きを「縦」（デフォルト）または「横」（l と入力）に設定.  
ページレイアウト変更: pdfjam を使用してページを指定された形式（例: 2x1）に再配置.  
小冊子形式の生成: pdfbook コマンドで、小冊子形式のPDFを生成可能.    
結果ファイルの保存: 加工済みPDFを新しい名前で保存.  
入力内容に応じて動作が変わり,PDFの加工や小冊子作成を効率的に行えます.  

今回は，編集する大元のpdfの取得→ページレイアウトを取得→pdfをn up化の順番で動かしたいと思い設定しました．
では順番に実際にしようしているコマンドを紹介していきます．

## 使用コマンド   

```zsh   
#!/bin/zsh -x
cd "$(dirname "$0")"   
```  

まず１行目の#!/bin/zsh -xはzshというshellの一種でOS上でユーザーとコンピューターが対話するためのインターフェースを提供する仕組みです(なおこれがshellと呼ばれる理由です．物知りになれましたね!)
次に2行目にはfileが存在する場所を習得します．簡単にいうとパソコンは以下のようなtree構造をしています.これをいちいち調べることがめんどくさいため導入しています(なおここの""で変数を囲っているものは私の２時間の成果です．エラーメッセージがしっかりしてて欲しかった😭)   
/・・・(user name) ・・・Documents・・・物理学 
　　　　　　　　　　　　　　　　　　　・・・数学  
　　　　　　　　　　・・・photo  
(treeの表示方法がわからなかったので少々見にくくなってしまいすみません)  
続いては
```zsh
echo "これらが今回使用できるファイルです"
echo "-----------------------------------"
ls 
echo "-----------------------------------"
echo "ファイルの名前を入力してください (.pdfの拡張子を抜いて):"
read inpname
```
かなり原始的ですがlsというコマンドで同じ階層にあるファイルをリストにするというコマンドです．
それに囲いをつけた形です．これにより正しいpdfファイルのコピーが可能となっています．その後，ファイルを習得し，変数に格納するためにread というコマンドを使いました．(echoとは指定した文字列をそのまま表示するコマンドです)
```zsh   
filename="$inpname.pdf"
echo "指定したpdfは $filename です"
if [ -f "$filename" ]; then
    echo "無事$filename を確認しました"
else
    echo "ファイルが存在しないので入力を確認してください(コピペがおすすめです)" 
    exit 0
fi
```
次はファイルの名前変数を設定しています．また，if構文を用いてファイルが現在自分が存在する階層に存在することを判定できるようにし，エラーをはいた場合エラーメッセージを出すようにしました．
なお，if構文に関してはqiita上にある他の記事がおすすめです．(これは自分がどこでエラーが起きたかわからなくなり１時間消費した反省が反映されています)   

```zsh
echo "ファイルを縦にしますか？横の場合はl(これはLの小文字です)を押してください．縦の場合はそのままenterでお願いします"
read filestyle
echo "2x1(全て半角)"
#(実は小冊子を作りたい時はpdfbookと入れてくださると小冊子となります)
read fileup 
if [ "$filestyle" = l ];then
    filestyle='--landscape '
else
#　縦書きの場合に出力をリセット(オップションをつけない)
   unset filestyle
fi
```
こちらのコマンドではlandscapeを取得したいのですがlandscapeの綴りは入力が難しいためlで補完されるようになります.またfileのup数(例えば2x1と入力すると横に2枚，縦に1枚紙を並べた見開き形式ということを意味します)もreadコマンドで関数を決定します
(なお，後から使用するコマンドの説明で書きますが，関数にnull入力をすると縦のA4となります．)
```zsh
if [ "$fileup" = pdfbook ];then
   pdfbook "$filename" --outfile "${inpname}_book.pdf"
   echo "これで処理を終わります"
   exit 0
else 
   pdfjam "$filename" --nup $fileup $filestyle--outfile "#${inpname}_${fileup}.pdf"
fi
echo "-----------------------------------"
echo "終わりました"
```
こちらではmactexのコマンドを使用しています．なので，macを入れるだけでlatexmkrcの設定などをする前からこのスクリプトを使用できます．
このコマンドはif構文でpdfを小冊子形式で印刷するものと，pdfを見開きなどにするためのものです
これらはmactex内部のpdfnupをネットで検索するとわかると思います．   
このコマンドでは$filestyleが""（空白）である場合縦となり，landscapeの場合では横となります．また，出力ファイルはup数による実際に自分が入力したものを再利用するようにしています．
# 実際の動作
ファイルを開くとこのような画面が出るようになります．
![Screenshot 2024-12-06 at 2.34.04 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939974/dac38b4e-6c45-a0fd-3574-d4402289fe2e.png)
ここで私は"微分積分4"と入力しました．（上の一覧表示からコピーペーストをするとミスがなくなり良いです)
![Screenshot 2024-12-06 at 2.35.32 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939974/6074e1ab-a8ad-3140-9c48-16332544cd0b.png)
そして"l"と入力し，処理が完了します
![Screenshot 2024-12-06 at 2.36.07 AM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939974/ba659e70-5836-4575-0b7c-427513e7f756.png)
使用したpdfファイルの問題で作ったものを表示することはできませんが，想定通り，見開きのファイルになっています．

# まとめ
このコードはごくごく簡単な内容で構成されていますが，特殊文字の影響により実際の環境で動作させることが難しいことが作ってみると学べると思います．時間があれば作ってみてください！
なお，このコードは需要があればdiscord内でも共有します！興味ある人は気軽にdmしてください！