Skip to content

Instantly share code, notes, and snippets.

@yarakos95
Last active November 11, 2021 11:22
Show Gist options
  • Save yarakos95/5a982d60013ffe7eaa97b298f07dd00e to your computer and use it in GitHub Desktop.
Save yarakos95/5a982d60013ffe7eaa97b298f07dd00e to your computer and use it in GitHub Desktop.
llmk にパッチを当ててLaTeX Workshop に上手く処理させる

Patch of llmk for LaTeX Workshop

LaTeX Workshop ではさまざまなタイプセット方法が許容されているが,llmk によるタイプセットでは問題が生じる.これは以下の記事に詳しい.

cf. LaTeX Workshopでllmkしてみたらアレだった件 - マクロツイーター

この問題点は,以下のようなものである.

最終的に解決している警告を拾ってしまう

これは,llmk が複数回タイプセットを繰り返している際に出力するターミナルログに含まれる警告をLaTeX Wrokshop がすべて拾ってしまうことに起因している.

latexmk でもターミナルログの結果はllmk と同じようなものになるが,LaTeX Workshop ではこれを上手く解消している.latexmk は特別扱いされている.

これを解決する方法はいくつかあるだろう.

  • LaTeX Wrokshop がllmk に対応する
  • llmk の出力をlatexmk のように振る舞うようにする (上記事で行っている)
  • llmk が最後に実行したタイプセットのログのみを出力する

1番目を期待したいところだが,今回は3番目を実現しようと思う.

本当はLua を利用して実装すれば環境を問わずに実行できるようになるが,作者の都合からバッチを利用して作成する.

Environment

  • Windows10
  • LaTeX Workshop ver. 8.19.2
  • llmk ver. 0.2.0

注意 : llmk の更新次第によってはこのパッチが利用できなくなる可能性があります.

Process

llmk では--verbose オプションを付与することで,実行されるタイプセットのコマンドラインをターミナルログに表示させることが出来る. これをマーカーにして,最後に実行されたタイプセットのみをターミナルに出力するようにバッチを組みたい.

ターミナルログを選別するのは不可能だと思われるので,一旦ログを*.llmk.log ファイルに記載し,このファイルから必要なログを抽出する方法を取りたい.

Additional process

必要なログのみを抽出する操作の他に2つの機能を追加してみたい.

  • タイプセット実行前にlacheck を利用して構文解析を行う
  • *.blg があった場合,*.bibtex.log に変更する

lacheck は構文解析としては簡易的だが,最低限これを通過しなければタイプセットはエラーになる.エラーになりうる箇所を事前に知る方が良いだろう.

BibTeX のログファイルであるblg ファイルは,Windows では"Windows Binary Performance Log File" として理解される.ちょっとだけ不快なので,拡張子を*.bibtex.log に変更しておきたい. このプロセスはBibTeX の実行の有無に関係ない.

これらの機能は引数として与えることで実行可能なようにしておく.

Usage

次のバッチファイルは適当なところに設置する.

https://gist.github.com/Yarakashi-Kikohshi/5a982d60013ffe7eaa97b298f07dd00e#file-02_patchllmk4lw-bat

今回は例として以下のディレクトリに設置したものとする.

X:/path/to/batch/file/patchllmk4lw.bat

基本的な実行方法はターミナルで以下のようにする. 引数は常にTeX ファイルの後に付ける.引数は同不順. また,ファイル名はフルパスでも問題ない.

$ X:/path/to/batch/file/patchllmk4lw.bat test.tex [--arg]

引数は以下の2つがある.

引数 実行されるプロセス
--lacheck lacheck の実行
--renameblg blg ファイルの拡張子変更

Set up for LaTeX Workshop

tools でバッチファイルをフルパスで指定しておけばどのルートでも実行可能になる.

もちろん,オプションプロセスは任意で有効にしておけば良い.

  "latex-workshop.latex.recipes": [
    {
      "name": "llmk: Build with Batch",
      "tools": [
        "llmk-batch"
      ],
    },
  ],
  "latex-workshop.latex.tools": [
    {
      "name": "llmk-batch",
      "command": "X:\\path\\to\\batch\\patchllmk4lw.bat",
      "args": [
        "%DOC%",
        "--renameblg",
        "--lacheck",
      ],
    },
  ],

Demo

デモとして,次のようなLaTeX ファイルとbib ファイルがあるとする.

% +++++
% llmk_version = 1.1.0
% sequence = [ "latex", "bibtex", "latex" ]
% +++++
\documentclass[11pt,a4paper]{jlreq}
\usepackage{luatexja}
\usepackage{hyperref}
\begin{document}
\section{\LaTeX{} Workshop で\textsf{llmk} する}

Batch でパッチを当てれば\LaTeX{} Workshop
でもマトモに\textsf{llmk}~\cite{asakura2020Light} 出来る.

\bibliography{test.bib}
\bibliographystyle{plain}

\end{document}
@misc{asakura2020Light,
  author       = {Takuto Asakura},
  title        = {{Light} {\LaTeX} {Make} - \textsf{llmk}: {A} build tool for {\LaTeX} documents},
  howpublished = {\url{https://ctan.org/pkg/light-latex-make}},
  year         = {2020}
}

これらが各々のエラーを含んでいた場合の結果を見てみたい.

Fail LaTeX syntax

lacheck で検出する場合とLaTeX のエラーとして検出される2つある.

Detect by lacheck

エラー : \begin{documents} になっている

エラーデモコード (折りたたみ)

% +++++
% llmk_version = 1.1.0
% sequence = [ "latex", "bibtex", "latex" ]
% +++++
\documentclass[11pt,a4paper]{jlreq}
\usepackage{luatexja}
\usepackage{hyperref}
\begin{documents}
\section{\LaTeX{} Workshop で\textsf{llmk} する}

Batch でパッチを当てれば\LaTeX{} Workshop
でもマトモに\textsf{llmk}~\cite{asakura2020Light} 出来る.

\bibliography{test.bib}
\bibliographystyle{plain}

\end{document}

lacheck error

lacheck が構文エラーを検出している.

LaTeX Error

エラー : \LaTex になっている

エラーデモコード (折りたたみ)

% +++++
% llmk_version = 1.1.0
% sequence = [ "latex", "bibtex", "latex" ]
% +++++
\documentclass[11pt,a4paper]{jlreq}
\usepackage{luatexja}
\usepackage{hyperref}
\begin{document}
\section{\LaTeX{} Workshop で\textsf{llmk} する}

Batch でパッチを当てれば\LaTex{} Workshop
でもマトモに\textsf{llmk}~\cite{asakura2020Light} 出来る.

\bibliography{test.bib}
\bibliographystyle{plain}

\end{document}

LaTeX error

Fail llmk syntax

llmk の構文エラーは以下のように検出される.

エラー : sequence が閉じていない

エラーデモコード (折りたたみ)

% +++++
% llmk_version = 1.1.0
% sequence = [ "latex", "bibtex", "latex
% +++++
\documentclass[11pt,a4paper]{jlreq}
\usepackage{luatexja}
\usepackage{hyperref}
\begin{document}
\section{\LaTeX{} Workshop で\textsf{llmk} する}

Batch でパッチを当てれば\LaTeX{} Workshop
でもマトモに\textsf{llmk}~\cite{asakura2020Light} 出来る.

\bibliography{test.bib}
\bibliographystyle{plain}

\end{document}

llmk error

同じエラーが2つ出てしまっている点は改良の余地あり.

Digression

だいたいこんな感じで上手くいくのでは.

Implement

llmk のターミナルログを*.llmk.log に出力し,これから必要なログのみを抽出する.

Extract the terminal log when llmk last ran

llmk の--verbose オプションを利用して,必要なログのみを抽出出来るようにする.

  • LaTeX エラーなしの場合
    • 最後のllmk info: 以降のログを出力
  • LaTeX エラーありの場合
    • llmk error: Fail running 以降のログを出力
  • llmk の構文エラーがある場合
    • llmk error:llmk warning 以降のログを出力
    • エラー表示を並び替えてProblem パネルに出力させる
setlocal enabledelayedexpansion
@REM SEARCH "llmk info:" OR "llmk warning:" OR "llmk error:"
@REM IF EXIST "llmk warning:" OR "llmk error:", SWITCH
for /f "tokens=2" %%a in ('findstr /n /b "llmk.*:" %LLMK_LOG%') do (
    set CAUTION_MSG=%%a
    @REM echo !CAUTION_MSG!
    if not !CAUTION_MSG!==info: (
        goto LLMK_CAUTION
    )
)
goto LLMK_NORMAL

:LLMK_CAUTION
for /f "tokens=3-4" %%a in ('findstr /c:"llmk error: Fail running" %LLMK_LOG%') do (
    set FAIL_RUNNING=%%a%%b
)
if "%FAIL_RUNNING%"=="Failrunning" (
    goto LLMK_NORMAL
) else (
    goto LLMK_FAIL
)

:LLMK_FAIL
set N=1
for /f "tokens=1 delims=:" %%L in ('findstr /n /c:"llmk %CAUTION_MSG%" %LLMK_LOG%') do (
    set CAUTION_LINE[!N!]=%%L
    set /a N=N+1
)
set OUTPUT_LINE=!CAUTION_LINE[1]!

@REM TYPE LAST RUNNING LaTeX LOG
set /a DISPLAY_OUTPUT=OUTPUT_LINE-1
type %LLMK_LOG% | more +%DISPLAY_OUTPUT%
for /f "tokens=4*" %%i in ('findstr /c:"llmk %CAUTION_MSG% -->" %LLMK_LOG%') do (
    echo %%i Syntax error: llmk
    echo %%j
    echo.
)
echo Output written on %LLMK_LOG% (llmk).
endlocal
exit /b %LLMK_EXIT_CODE%

:LLMK_NORMAL
@REM SEARCH LAST RUNNING LaTeX COMMAND
for /f "tokens=1 delims=:" %%L in ('findstr /n /c:"llmk info: Running command:" %LLMK_LOG%') do (
    set NORMAL_LINE=%%L
)
set OUTPUT_LINE=%NORMAL_LINE%

@REM TYPE LAST RUNNING LaTeX LOG
set /a DISPLAY_OUTPUT=OUTPUT_LINE-1
type %LLMK_LOG% | more +%DISPLAY_OUTPUT%
endlocal
exit /b %LLMK_EXIT_CODE%

Option process

以下の3つを確認.

  • オプション引数の繰り返し処理
  • lacheck の実行
  • *.blg*.bibtex.log に変更

Get arguments repeatedly

オプションプロセスとして2つのプロセスを実装している. これをオプション引数から実行するようにする.

  1. %2 以降の引数をオプションとしている
  2. shiftgoto loop を使って繰り返し判定する
  3. 存在する引数があった場合,オプションプロセスの実行キー.._PROCESS1 にする

不親切設計なので,不明なオプション引数はスキップされる.

set LACHECK_PROCESS=0
set RENAME_BLG_PROCESS=0
set ARGS_COUNT=0
:loop
set /a ARGS_COUNT=ARGS_COUNT+1
if "%ARGS_COUNT%"=="3" (
    goto OUT_LOOP
)
if "%~2"=="--lacheck" (
    set LACHECK_PROCESS=1
) else if "%~2"=="--renameblg" (
    set RENAME_BLG_PROCESS=1
)
shift /2
goto loop
:OUT_LOOP

各オプションプロセスの実行手前では,次のように実行キーが10 かを判定させる.

if "%LACHECK_PROCESS%"=="1" (
    goto LACHECK_PROCESS_START
) else if "%LACHECK_PROCESS%"=="0" (
    goto LACHECK_PROCESS_SKIP
)

オプションプロセスは:.._PROCESS_START:.._PROCESS_SKIP で挟めば良い.

Run lacheck

  1. lacheck の結果を*.llmk.log ファイルに記載
    • なにも記載されていない場合
      • エラーなしとして終了
    • 記載されている場合
      • エラー表示を並び替えてProblem パネルに出力させる
if "%LACHECK_PROCESS%"=="1" (
    goto LACHECK_PROCESS_START
) else if "%LACHECK_PROCESS%"=="0" (
    goto LACHECK_PROCESS_SKIP
)

:LACHECK_PROCESS_START
echo Detect syntax errors with lacheck...
call lacheck %TARGET_FILE% > %LLMK_LOG%

setlocal enabledelayedexpansion
set LOG_FILE_SIZE=0
for %%S in (%LLMK_LOG%) do (
    set LOG_FILE_SIZE=%%~zS
)
if "%LOG_FILE_SIZE%"=="0" (
    goto LACHECK_NO_ERROR
) else (
    goto LACHECK_ERROR_OUTPUT
)

:LACHECK_ERROR_OUTPUT
echo // Detected syntax errors
for /f "tokens=3* usebackq" %%a in ("%LLMK_LOG%") do (
    echo %TARGET_FILE%:%%a Syntax error: lacheck
    echo %%b
    echo.
)
echo Output written on %LLMK_LOG% (lacheck).
endlocal
exit /b 1
:LACHECK_NO_ERROR
echo // Do not detect syntax errors.

:LACHECK_PROCESS_SKIP

Rename the file from *.blg to *bibtex.log

*.blg*.bibtex.log に変更します.

  1. *.blg を探す
    • ない場合は終了
    • ある場合
      1. *.bibtex.log を削除 (ren コマンドでは上書き不可のため)
      2. ren コマンドによって*blg*.bibtex.log に変更
if "%RENAME_BLG_PROCESS%"=="1" (
    goto RENAME_BLG_PROCESS_START
) else if "%RENAME_BLG_PROCESS%"=="0" (
    goto RENAME_BLG_PROCESS_SKIP
)

:RENAME_BLG_PROCESS_START
echo.
@REM ----- ------ RENAME EXTENSION THAT .BLG TO .BIBTEX.LOG ----- ------
echo Rename ".blg" to ".bibtex.log"...

@REM SEARCH BLG FILE SEQUENCE
set BLG_FILE=
echo // Search "%TARGET_FILE_NAME%.blg"...
for /f %%F in ('dir /s/b "%TARGET_FILE_NAME%.blg" 2^> nul') do (
    set BLG_FILE=%%~nxF
)

setlocal enabledelayedexpansion
if "%TARGET_FILE_NAME%.blg"=="%BLG_FILE%" (
    echo // Rename "%TARGET_FILE_NAME%.blg" to "%TARGET_FILE_NAME%.bibtex.log"
    goto RENAME_BLG_EXT
) else (
    echo // NO EXIST BLG FILE.
    goto TYPE_PHASE
)
endlocal

:RENAME_BLG_EXT
echo.
echo 1.Delete %TARGET_FILE_NAME%.bibtex.log
del %TARGET_FILE_NAME%.bibtex.log 2> nul
echo.
echo 2.Rename %TARGET_FILE_NAME%.blg to %TARGET_FILE_NAME%.bibtex.log
ren %TARGET_FILE_NAME%.blg %TARGET_FILE_NAME%.bibtex.log 2> nul
echo.
echo // Finish to rename extension. (Error Level: %errorlevel%)

:RENAME_BLG_PROCESS_SKIP

Pass the log to LaTeX Workshop

ターミナルに次のようなログが出力されていればエラーや警告をLaTeX Workshop が拾うようになる.

Output written on hogehoge (foo foo).

要は,これを出力しておけば,それより上にあるターミナルログは警告やエラーであると誤認する.

これは以下のパーサに由来している.

const latexPattern = /^Output\swritten\son\s(.*)\s\(.*\)\.$/gm

cf. https://github.com/James-Yu/LaTeX-Workshop/blob/58e0bb96feaadda53cb9ae365074b94d146ab33d/src/components/parser/log.ts#L8

@echo off
@REM Copyright 2021 Yarakashi Kikohshi
@REM Released under the MIT License
@REM https://opensource.org/licenses/mit-license.php
@REM Purpose of this batch script.
@REM : patchllmk4lw.bat
@REM Patch of llmk for LaTeX Workshop on Visual Studio Code.
@REM Eliminate duplicate warnings and pass only warnings
@REM issued in the last build to the LaTeX Workshop.
@REM version.0.2
@REM support llmk version: 0.2.0 - 1.1.0
@REM TARGET FILE PATH AND NAME
set TARGET_FILE=%~dpn1.tex
set TARGET_FILE_NAME=%~n1
@REM LOG FILE
set LLMK_LOG=%TARGET_FILE_NAME%.llmk.log
@REM HANDLE OF ARGS
set LACHECK_PROCESS=0
set RENAME_BLG_PROCESS=0
set ARGS_COUNT=0
:loop
set /a ARGS_COUNT=ARGS_COUNT+1
if "%ARGS_COUNT%"=="3" (
goto OUT_LOOP
)
if "%~2"=="--lacheck" (
set LACHECK_PROCESS=1
) else if "%~2"=="--renameblg" (
set RENAME_BLG_PROCESS=1
)
shift /2
goto loop
:OUT_LOOP
@REM echo ----- ----- ----- ----- -----
@REM CHECK SYNTAX
if "%LACHECK_PROCESS%"=="1" (
goto LACHECK_PROCESS_START
) else if "%LACHECK_PROCESS%"=="0" (
goto LACHECK_PROCESS_SKIP
)
:LACHECK_PROCESS_START
echo Detect syntax errors with lacheck...
call lacheck %TARGET_FILE% > %LLMK_LOG%
setlocal enabledelayedexpansion
set LOG_FILE_SIZE=0
for %%S in (%LLMK_LOG%) do (
set LOG_FILE_SIZE=%%~zS
)
if "%LOG_FILE_SIZE%"=="0" (
goto LACHECK_NO_ERROR
) else (
goto LACHECK_ERROR_OUTPUT
)
:LACHECK_ERROR_OUTPUT
echo // Detected syntax errors
for /f "tokens=3* usebackq" %%a in ("%LLMK_LOG%") do (
echo %TARGET_FILE%:%%a Syntax error: lacheck
echo %%b
echo.
)
echo Output written on %LLMK_LOG% (lacheck).
endlocal
exit /b 1
:LACHECK_NO_ERROR
echo // Do not detect syntax errors.
:LACHECK_PROCESS_SKIP
@REM GET BATCH RUNNING DATE
set yyyy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%
set hour=%time:~0,2%
set min=%time:~3,2%
set sec=%time:~6,2%
echo.> %LLMK_LOG%
echo DATE: %yyyy% %mm% %dd%>>%LLMK_LOG%
echo TIME: %hour: =0% %min% %sec%>>%LLMK_LOG%
echo.>>%LLMK_LOG%
@REM echo ----- ----- ----- ----- -----
echo.
echo llmk Running ...
@REM OUTPUT llmk VERSION
echo ----- ----- llmk VERSION ----- ----->>%LLMK_LOG%
call llmk --version>>%LLMK_LOG%
echo.>>%LLMK_LOG%
echo Repository: https://github.com/wtsnjp/llmk>>%LLMK_LOG%
echo.>>%LLMK_LOG%
@REM RUN llmk WITH VERBOSE OPTION
echo ----- ----- llmk RUN ----- ----->>%LLMK_LOG%
call llmk --verbose %TARGET_FILE%>>%LLMK_LOG% 2>&1
set LLMK_EXIT_CODE=%errorlevel%
echo.>>%LLMK_LOG%
echo // Finish llmk running.
@REM SORTING ERROR TYPE AND TYPE IN LOG FILE
if "%LLMK_EXIT_CODE%"=="0" (
goto LLMK_SUCCESS
) else if "%LLMK_EXIT_CODE%"=="1" (
goto LLMK_GENERAL_ERROR
) else if "%LLMK_EXIT_CODE%"=="2" (
goto LLMK_INVOKED_ERROR
) else if "%LLMK_EXIT_CODE%"=="3" (
goto LLMK_PARSER_ERROR
) else "%LLMK_EXIT_CODE%"=="4" (
goto LLMK_TYPE_ERROR
)
:LLMK_SUCCESS
echo llmk info: Success (Exit Code: %LLMK_EXIT_CODE%)>>%LLMK_LOG%
goto RENAME_BLG
:LLMK_GENERAL_ERROR
echo llmk info: General Error (Exit Code: %LLMK_EXIT_CODE%)>>%LLMK_LOG%
goto RENAME_BLG
:LLMK_INVOKED_ERROR
echo llmk info: Invoked Program Error (Exit Code: %LLMK_EXIT_CODE%)>>%LLMK_LOG%
goto RENAME_BLG
:LLMK_PARSER_ERROR
echo llmk info: Parser Error (Exit Code: %LLMK_EXIT_CODE%)>>%LLMK_LOG%
goto TYPE_PHASE
:LLMK_TYPE_ERROR
echo llmk info: Type Error (Exit Code: %LLMK_EXIT_CODE%)>>%LLMK_LOG%
goto RENAME_BLG
:RENAME_BLG
if "%RENAME_BLG_PROCESS%"=="1" (
goto RENAME_BLG_PROCESS_START
) else if "%RENAME_BLG_PROCESS%"=="0" (
goto RENAME_BLG_PROCESS_SKIP
)
:RENAME_BLG_PROCESS_START
echo.
@REM ----- ------ RENAME EXTENSION THAT .BLG TO .BIBTEX.LOG ----- ------
echo Rename ".blg" to ".bibtex.log"...
@REM SEARCH BLG FILE SEQUENCE
set BLG_FILE=
echo // Search "%TARGET_FILE_NAME%.blg"...
for /f %%F in ('dir /s/b "%TARGET_FILE_NAME%.blg" 2^> nul') do (
set BLG_FILE=%%~nxF
)
setlocal enabledelayedexpansion
if "%TARGET_FILE_NAME%.blg"=="%BLG_FILE%" (
echo // Rename "%TARGET_FILE_NAME%.blg" to "%TARGET_FILE_NAME%.bibtex.log"
goto RENAME_BLG_EXT
) else (
echo // NO EXIST BLG FILE.
goto TYPE_PHASE
)
endlocal
:RENAME_BLG_EXT
echo.
echo 1.Delete %TARGET_FILE_NAME%.bibtex.log
del %TARGET_FILE_NAME%.bibtex.log 2> nul
echo.
echo 2.Rename %TARGET_FILE_NAME%.blg to %TARGET_FILE_NAME%.bibtex.log
ren %TARGET_FILE_NAME%.blg %TARGET_FILE_NAME%.bibtex.log 2> nul
echo.
echo // Finish to rename extension. (Error Level: %errorlevel%)
:RENAME_BLG_PROCESS_SKIP
:TYPE_PHASE
echo.
@REM ----- ----- TYPE_PHASE ----- -----
@REM echo ----- ----- ----- ----- -----
echo Type last log of llmk...
echo //
setlocal enabledelayedexpansion
@REM SEARCH "llmk info:" OR "llmk warning:" OR "llmk error:"
@REM IF EXIST "llmk warning:" OR "llmk error:", SWITCH
for /f "tokens=2" %%a in ('findstr /n /b "llmk.*:" %LLMK_LOG%') do (
set CAUTION_MSG=%%a
@REM echo !CAUTION_MSG!
if not !CAUTION_MSG!==info: (
goto LLMK_CAUTION
)
)
goto LLMK_NORMAL
:LLMK_CAUTION
for /f "tokens=3-4" %%a in ('findstr /c:"llmk error: Fail running" %LLMK_LOG%') do (
set FAIL_RUNNING=%%a%%b
)
if "%FAIL_RUNNING%"=="Failrunning" (
goto LLMK_NORMAL
) else (
goto LLMK_FAIL
)
:LLMK_FAIL
set N=1
for /f "tokens=1 delims=:" %%L in ('findstr /n /c:"llmk %CAUTION_MSG%" %LLMK_LOG%') do (
set CAUTION_LINE[!N!]=%%L
set /a N=N+1
)
set OUTPUT_LINE=!CAUTION_LINE[1]!
@REM TYPE LAST RUNNING LaTeX LOG
set /a DISPLAY_OUTPUT=OUTPUT_LINE-1
type %LLMK_LOG% | more +%DISPLAY_OUTPUT%
@REM https://github.com/James-Yu/LaTeX-Workshop/blob/58e0bb96feaadda53cb9ae365074b94d146ab33d/src/components/parser/log.ts
@REM TYPE llmk ERROR FOR LaTeX Workshop'S LOG PARSER
for /f "tokens=4*" %%i in ('findstr /c:"llmk %CAUTION_MSG% -->" %LLMK_LOG%') do (
echo %%i Syntax error: llmk
echo %%j
echo.
)
echo Output written on %LLMK_LOG% (llmk).
endlocal
exit /b %LLMK_EXIT_CODE%
:LLMK_NORMAL
@REM SEARCH LAST RUNNING LaTeX COMMAND
for /f "tokens=1 delims=:" %%L in ('findstr /n /c:"llmk info: Running command:" %LLMK_LOG%') do (
set NORMAL_LINE=%%L
)
set OUTPUT_LINE=%NORMAL_LINE%
@REM TYPE LAST RUNNING LaTeX LOG
set /a DISPLAY_OUTPUT=OUTPUT_LINE-1
type %LLMK_LOG% | more +%DISPLAY_OUTPUT%
endlocal
exit /b %LLMK_EXIT_CODE%

OLD VERSION

Patch of llmk for LaTeX Workshop

LaTeX Workshop ではさまざまなタイプセット方法が許容されているが,llmk によるタイプセットでは問題が生じる.これは以下の記事に詳しい.

LaTeX Workshopでllmkしてみたらアレだった件 - マクロツイーター

この問題点は,相互参照の問題を解決するための複数回のタイプセットによって生じる警告をすべて拾ってしまうということである.

上の記事内ではLaTeX Workshop 内のコードをいじって解決させていたが,拡張機能のコードをいじるのには抵抗がある.

llmk にBatch を当ててこれを解決させようと思う. 解決方法は以下の通り.

  • llmk でのビルドログをhoge.llmk.log ファイルに記載
  • ログファイルから最後のllmk info: Running command: より下をtype

要は,最後にトリガーされたLaTeX だけを出力してあげれば,これだけをLaTeX Workshop が読むので,それまでの警告は無視されて警告に関する問題は解決するということになる.はず.

作成したBatch は次のファイルに.ファイル名は"Patch of llmk for LaTeX Workshop" から"patchllmk4lw.bat" とした.

Environment

  • Windows10
  • LaTeX Workshop ver. 8.19.2
  • llmk ver. 0.2.0

注意 : llmk の更新次第によってはこのパッチが利用できなくなる可能性があります.

Set Up

Batch ファイルを適当なディレクトリに配置してsettings.json にtool とrecipe を追加する.

以下ではX:\path\to\batch に設置した.

  "latex-workshop.latex.recipes": [
    {
      "name": "llmk: Build with Batch",
      "tools": [
        "llmk-batch"
      ],
    },
  ],
  "latex-workshop.latex.tools": [
    {
      "name": "llmk-batch",
      "command": "X:\\path\\to\\batch\\patchllmk4lw.bat",
      "args": [
        "%DOC%"
      ],
    },
  ],

あとはいつもの通りにLaTeX を作成してllmk: Build with Batch すれば良い.

Test Run

以下のようなLaTeX ドキュメントをタイプセットしたい.シンプルにbib ファイルだけを含むドキュメント.

% +++++
% llmk_version = 0.2.0
% sequence = [ "latex", "bibtex", "latex" ]
% +++++
\documentclass[11pt,a4paper]{jlreq}
\usepackage{luatexja}
\usepackage{hyperref}
\begin{document}
\section{\LaTeX{} Workshop で\textsf{llmk} する}\label{ref-section}

Batch でパッチを当てれば\LaTeX{} Workshop でもマトモに\textsf{llmk}\cite{asakura2020Light} 出来る.\ref{ref-section}

\bibliography{test.bib}
\bibliographystyle{plain}

\end{document}
@misc{asakura2020Light,
  author       = {Takuto Asakura},
  title        = {{Light} {\LaTeX} {Make} - \textsf{llmk}: {A} build tool for {\LaTeX} documents},
  howpublished = {\url{https://ctan.org/pkg/light-latex-make}},
  year         = {2020}
}

成功例と失敗例を紹介しておきたい.

Success

Success PDF Image Success llmk PDF

Output パネルのLaTeX Compiler に以下のような出力を得る.

LaTeX Compiler at Output Panel (折りたたみ)

警告が含まれる場合,ここにwarning などが記載される.これをLaTeX Workshop が拾ってProblem パネルに表示させている.

----- ----- ----- -----
llmk info: Running command: lualatex -interaction=nonstopmode -file-line-error -synctex=1 "d:/patch/latex/workshop/llmk/test.tex"
This is LuaHBTeX, Version 1.13.1 (TeX Live 2021/W32TeX)
 restricted system commands enabled.
(d:/patch/latex/workshop/llmk/test.tex
LaTeX2e <2020-10-01> patch level 4
 L3 programming layer <2021-02-18> (d:/texlive/2021/texmf-dist/tex/latex/jlreq/jlreq.cls
Document Class: jlreq 2021/03/17 jlreq
(d:/texlive/2021/texmf-dist/tex/latex/xkeyval/xkeyval.sty (d:/texlive/2021/texmf-dist/tex/generic/xkeyval/xkeyval.tex (d:/texlive/2021/texmf-dist/tex/generic/xkeyval/xkvutils.tex (d:/texlive/2021/texmf-dist/tex/generic/xkeyval/keyval.tex)))) (d:/texlive/2021/texmf-dist/tex/latex/everyhook/everyhook.sty (d:/texlive/2021/texmf-dist/tex/latex/svn-prov/svn-prov.sty) (d:/texlive/2021/texmf-dist/tex/latex/etoolbox/etoolbox.sty)) (d:/texlive/2021/texmf-dist/tex/latex/base/ifthen.sty) (d:/texlive/2021/texmf-dist/tex/latex/jlreq/jlreq-helpers.sty) jlreq guessed engine: lualatex (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/luatexja.sty (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/luatexja-core.sty (d:/texlive/2021/texmf-dist/tex/luatex/luatexbase/luatexbase.sty (d:/texlive/2021/texmf-dist/tex/luatex/ctablestack/ctablestack.sty)) (d:/texlive/2021/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty) (d:/texlive/2021/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty (d:/texlive/2021/texmf-dist/tex/generic/infwarerr/infwarerr.sty) (d:/texlive/2021/texmf-dist/tex/generic/iftex/iftex.sty)) (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/ltj-base.sty) (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/ltj-latex.sty (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/patches/lltjfont.sty (d:/texlive/2021/texmf-dist/tex/latex/base/tuenc.def) (d:/texlive/2021/texmf-dist/tex/latex/everysel/everysel.sty (d:/texlive/2021/texmf-dist/tex/latex/everysel/everysel-2011-10-28.sty)) ABD: EverySelectfont initializing macros) (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/patches/lltjdefs.sty
(d:/texlive/2021/texmf-dist/tex/luatex/jlreq/jfm-jlreqv.lua)
(d:/texlive/2021/texmf-dist/tex/luatex/jlreq/jfm-jlreq.lua)) (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/patches/lltjcore.sty (d:/texlive/2021/texmf-dist/tex/latex/l3kernel/expl3.sty (d:/texlive/2021/texmf-dist/tex/latex/l3backend/l3backend-luatex.def))) (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/patches/lltjp-atbegshi.sty) (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/patches/lltjp-geometry.sty (d:/texlive/2021/texmf-dist/tex/generic/iftex/ifluatex.sty)))) (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/luatexja-compat.sty)) (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/addons/luatexja-adjust.sty) (d:/texlive/2021/texmf-dist/tex/latex/lm/lmodern.sty)) (d:/texlive/2021/texmf-dist/tex/latex/hyperref/hyperref.sty (d:/texlive/2021/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty) (d:/texlive/2021/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty) (d:/texlive/2021/texmf-dist/tex/generic/pdfescape/pdfescape.sty) (d:/texlive/2021/texmf-dist/tex/latex/hycolor/hycolor.sty) (d:/texlive/2021/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty) (d:/texlive/2021/texmf-dist/tex/latex/auxhook/auxhook.sty) (d:/texlive/2021/texmf-dist/tex/latex/kvoptions/kvoptions.sty) (d:/texlive/2021/texmf-dist/tex/latex/hyperref/pd1enc.def) (d:/texlive/2021/texmf-dist/tex/latex/hyperref/hyperref-langpatches.def) (d:/texlive/2021/texmf-dist/tex/generic/intcalc/intcalc.sty) (d:/texlive/2021/texmf-dist/tex/generic/etexcmds/etexcmds.sty) (d:/texlive/2021/texmf-dist/tex/latex/hyperref/puenc.def) (d:/texlive/2021/texmf-dist/tex/latex/url/url.sty) (d:/texlive/2021/texmf-dist/tex/generic/bitset/bitset.sty (d:/texlive/2021/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty)) (d:/texlive/2021/texmf-dist/tex/latex/base/atbegshi-ltx.sty)) (d:/texlive/2021/texmf-dist/tex/latex/hyperref/hluatex.def (d:/texlive/2021/texmf-dist/tex/generic/stringenc/stringenc.sty) (d:/texlive/2021/texmf-dist/tex/latex/base/atveryend-ltx.sty) (d:/texlive/2021/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty (d:/texlive/2021/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty))) (./test.aux) (d:/texlive/2021/texmf-dist/tex/latex/base/ts1cmr.fd) ABD: EverySelectfont initializing macros (d:/texlive/2021/texmf-dist/tex/latex/hyperref/nameref.sty (d:/texlive/2021/texmf-dist/tex/latex/refcount/refcount.sty) (d:/texlive/2021/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty)) (./test.out) (./test.out) (d:/texlive/2021/texmf-dist/tex/latex/lm/ot1lmr.fd) (d:/texlive/2021/texmf-dist/tex/latex/lm/omllmm.fd) (d:/texlive/2021/texmf-dist/tex/latex/lm/omslmsy.fd) (d:/texlive/2021/texmf-dist/tex/latex/lm/omxlmex.fd) (./test.bbl) [1{d:/texlive/2021/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./test.aux))
 2141 words of node memory still in use:
   8 hlist, 1 vlist, 5 rule, 2 glue, 7 kern, 2 glyph, 684 attribute, 73 glue_spec, 38 attribute_list, 1 write, 17 user_defined, 1 pdf_action nodes
   avail lists: 1:10,2:8746,3:123,4:102,5:108,6:20,7:874,8:43,9:193,10:2,11:12
<d:/texlive/2021/texmf-dist/fonts/opentype/public/lm/lmroman10-regular.otf><d:/texlive/2021/texmf-dist/fonts/opentype/public/lm/lmmono12-regular.otf><d:/texlive/2021/texmf-dist/fonts/opentype/public/lm/lmroman8-regular.otf><d:/texlive/2021/texmf-dist/fonts/opentype/public/lm/lmsans12-regular.otf><d:/texlive/2021/texmf-dist/fonts/opentype/public/haranoaji/HaranoAjiMincho-Regular.otf><d:/texlive/2021/texmf-dist/fonts/opentype/public/lm/lmroman12-regular.otf><d:/texlive/2021/texmf-dist/fonts/opentype/public/haranoaji/HaranoAjiGothic-Medium.otf><d:/texlive/2021/texmf-dist/fonts/opentype/public/lm/lmsans10-bold.otf>
Output written on test.pdf (1 page, 25849 bytes).

SyncTeX written on test.synctex.gz.
Transcript written on test.log.

llmk info: Success (Errorlevel: 0)
----- ----- ----- ----- -----

このときのProblem パネルでは何も表示されていない.

また,実行後のディレクトリは以下のようになった.Batch によってtest.llmk.log が作成されている.

D:\patch\latex\workshop\llmk> dir \s\b
    D:\patch\latex\workshop\llmk\test.aux
    D:\patch\latex\workshop\llmk\test.bbl
    D:\patch\latex\workshop\llmk\test.bib
    D:\patch\latex\workshop\llmk\test.blg
    D:\patch\latex\workshop\llmk\test.llmk.log
    D:\patch\latex\workshop\llmk\test.log
    D:\patch\latex\workshop\llmk\test.out
    D:\patch\latex\workshop\llmk\test.pdf
    D:\patch\latex\workshop\llmk\test.synctex.gz
    D:\patch\latex\workshop\llmk\test.tex

また,test.llmk.log ファイルを確認するとllmk によって自動的に以下のコマンドが実行されていることが分かる.

lualatex → bibtex → lualatex → lualatex

Failed

以下のように,\ref\cite で間違いがあるとしてみたい.

% +++++
% llmk_version = 0.2.0
% sequence = [ "latex", "bibtex", "latex" ]
% +++++
\documentclass[11pt,a4paper]{jlreq}
\usepackage{luatexja}
\usepackage{hyperref}
\begin{document}
\section{\LaTeX{} Workshop で\textsf{llmk} する}\label{ref-section}

Batch でパッチを当てれば\LaTeX{} Workshop でもマトモに\textsf{llmk}\cite{asakura2020Light_fail} 出来る.\ref{ref-section_fail}

\bibliography{test.bib}
\bibliographystyle{plain}

\end{document}

Failed PDF Image Failed llmk PDF

LaTeX Compiler at Output Panel (折りたたみ)

----- ----- ----- -----
llmk info: Running command: lualatex -interaction=nonstopmode -file-line-error -synctex=1 "d:/patch/latex/workshop/llmk/test.tex"
This is LuaHBTeX, Version 1.13.1 (TeX Live 2021/W32TeX)
 restricted system commands enabled.
(d:/patch/latex/workshop/llmk/test.tex
LaTeX2e <2020-10-01> patch level 4
 L3 programming layer <2021-02-18> (d:/texlive/2021/texmf-dist/tex/latex/jlreq/jlreq.cls
Document Class: jlreq 2021/03/17 jlreq
(d:/texlive/2021/texmf-dist/tex/latex/xkeyval/xkeyval.sty (d:/texlive/2021/texmf-dist/tex/generic/xkeyval/xkeyval.tex (d:/texlive/2021/texmf-dist/tex/generic/xkeyval/xkvutils.tex (d:/texlive/2021/texmf-dist/tex/generic/xkeyval/keyval.tex)))) (d:/texlive/2021/texmf-dist/tex/latex/everyhook/everyhook.sty (d:/texlive/2021/texmf-dist/tex/latex/svn-prov/svn-prov.sty) (d:/texlive/2021/texmf-dist/tex/latex/etoolbox/etoolbox.sty)) (d:/texlive/2021/texmf-dist/tex/latex/base/ifthen.sty) (d:/texlive/2021/texmf-dist/tex/latex/jlreq/jlreq-helpers.sty) jlreq guessed engine: lualatex (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/luatexja.sty (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/luatexja-core.sty (d:/texlive/2021/texmf-dist/tex/luatex/luatexbase/luatexbase.sty (d:/texlive/2021/texmf-dist/tex/luatex/ctablestack/ctablestack.sty)) (d:/texlive/2021/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty) (d:/texlive/2021/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty (d:/texlive/2021/texmf-dist/tex/generic/infwarerr/infwarerr.sty) (d:/texlive/2021/texmf-dist/tex/generic/iftex/iftex.sty)) (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/ltj-base.sty) (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/ltj-latex.sty (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/patches/lltjfont.sty (d:/texlive/2021/texmf-dist/tex/latex/base/tuenc.def) (d:/texlive/2021/texmf-dist/tex/latex/everysel/everysel.sty (d:/texlive/2021/texmf-dist/tex/latex/everysel/everysel-2011-10-28.sty)) ABD: EverySelectfont initializing macros) (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/patches/lltjdefs.sty
(d:/texlive/2021/texmf-dist/tex/luatex/jlreq/jfm-jlreqv.lua)
(d:/texlive/2021/texmf-dist/tex/luatex/jlreq/jfm-jlreq.lua)) (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/patches/lltjcore.sty (d:/texlive/2021/texmf-dist/tex/latex/l3kernel/expl3.sty (d:/texlive/2021/texmf-dist/tex/latex/l3backend/l3backend-luatex.def))) (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/patches/lltjp-atbegshi.sty) (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/patches/lltjp-geometry.sty (d:/texlive/2021/texmf-dist/tex/generic/iftex/ifluatex.sty)))) (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/luatexja-compat.sty)) (d:/texlive/2021/texmf-dist/tex/luatex/luatexja/addons/luatexja-adjust.sty) (d:/texlive/2021/texmf-dist/tex/latex/lm/lmodern.sty)) (d:/texlive/2021/texmf-dist/tex/latex/hyperref/hyperref.sty (d:/texlive/2021/texmf-dist/tex/generic/kvsetkeys/kvsetkeys.sty) (d:/texlive/2021/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty) (d:/texlive/2021/texmf-dist/tex/generic/pdfescape/pdfescape.sty) (d:/texlive/2021/texmf-dist/tex/latex/hycolor/hycolor.sty) (d:/texlive/2021/texmf-dist/tex/latex/letltxmacro/letltxmacro.sty) (d:/texlive/2021/texmf-dist/tex/latex/auxhook/auxhook.sty) (d:/texlive/2021/texmf-dist/tex/latex/kvoptions/kvoptions.sty) (d:/texlive/2021/texmf-dist/tex/latex/hyperref/pd1enc.def) (d:/texlive/2021/texmf-dist/tex/latex/hyperref/hyperref-langpatches.def) (d:/texlive/2021/texmf-dist/tex/generic/intcalc/intcalc.sty) (d:/texlive/2021/texmf-dist/tex/generic/etexcmds/etexcmds.sty) (d:/texlive/2021/texmf-dist/tex/latex/hyperref/puenc.def) (d:/texlive/2021/texmf-dist/tex/latex/url/url.sty) (d:/texlive/2021/texmf-dist/tex/generic/bitset/bitset.sty (d:/texlive/2021/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty)) (d:/texlive/2021/texmf-dist/tex/latex/base/atbegshi-ltx.sty)) (d:/texlive/2021/texmf-dist/tex/latex/hyperref/hluatex.def (d:/texlive/2021/texmf-dist/tex/generic/stringenc/stringenc.sty) (d:/texlive/2021/texmf-dist/tex/latex/base/atveryend-ltx.sty) (d:/texlive/2021/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty (d:/texlive/2021/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty))) (./test.aux) (d:/texlive/2021/texmf-dist/tex/latex/base/ts1cmr.fd) ABD: EverySelectfont initializing macros (d:/texlive/2021/texmf-dist/tex/latex/hyperref/nameref.sty (d:/texlive/2021/texmf-dist/tex/latex/refcount/refcount.sty) (d:/texlive/2021/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty)) (./test.out) (./test.out) (d:/texlive/2021/texmf-dist/tex/latex/lm/ot1lmr.fd) (d:/texlive/2021/texmf-dist/tex/latex/lm/omllmm.fd) (d:/texlive/2021/texmf-dist/tex/latex/lm/omslmsy.fd) (d:/texlive/2021/texmf-dist/tex/latex/lm/omxlmex.fd)

LaTeX Warning: Citation `asakura2020Light_fail' on page 1 undefined on input line 11.


LaTeX Warning: Reference `ref-section_fail' on page 1 undefined on input line 11.

(./test.bbl

LaTeX Warning: Empty `thebibliography' environment on input line 3.

) [1{d:/texlive/2021/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./test.aux)

LaTeX Warning: There were undefined references.

)
 1929 words of node memory still in use:
   8 hlist, 1 vlist, 5 rule, 2 glue, 5 kern, 2 glyph, 607 attribute, 67 glue_spec, 34 attribute_list, 1 write, 16 user_defined nodes
   avail lists: 1:10,2:5047,3:84,4:84,5:75,6:15,7:427,8:9,9:169,11:6
<d:/texlive/2021/texmf-dist/fonts/opentype/public/lm/lmroman10-regular.otf><d:/texlive/2021/texmf-dist/fonts/opentype/public/lm/lmroman12-bold.otf><d:/texlive/2021/texmf-dist/fonts/opentype/public/lm/lmsans12-regular.otf><d:/texlive/2021/texmf-dist/fonts/opentype/public/lm/lmroman8-regular.otf><d:/texlive/2021/texmf-dist/fonts/opentype/public/haranoaji/HaranoAjiMincho-Regular.otf><d:/texlive/2021/texmf-dist/fonts/opentype/public/lm/lmroman12-regular.otf><d:/texlive/2021/texmf-dist/fonts/opentype/public/haranoaji/HaranoAjiGothic-Medium.otf><d:/texlive/2021/texmf-dist/fonts/opentype/public/lm/lmsans10-bold.otf>
Output written on test.pdf (1 page, 21974 bytes).

SyncTeX written on test.synctex.gz.
Transcript written on test.log.

llmk info: Success (Errorlevel: 0)
----- ----- ----- ----- -----

LaTeX に警告が含まれていてもllmk はSuccess 判定になっているようだ.


警告は以下のように出力される.期待していた通り,重複するメッセージは出力されていない.

Fixed Error Message

もちろん,この出力ではPDF 上の相互参照は?? となっている.

Memo

llmk では--verbose オプションを有効にするとllmk info: Running command: に続いてLaTeX コマンドが引数付きで記載される. 今回,これをマーカーにして最後のタイプセットを判定している.

ただし,--verbose を含めてログファイルを作成しようとするとllmk info: Running command: の箇所はログファイルに記載されなくなる. これを記載させるためには標準エラーを含めるように2>&1 すれば良い.

Digressions

おそらくこのような解決法でllmk の相互参照の警告に関する問題は解決していると思われる. 利用していて不具合が発見されたら改善していきたい.それまでにはLaTeX Workshop がllmk に対応していてくれるだろう……

作成したBatch ファイルはLaTeX Workshop 外でも利用できる.また,カレントディレクトリから実行する場合であれば指定するTeX ファイルはフルパスである必要はないです.

$ X:\path\to\batch\patchllmk4lw.bat hoge.tex

MIT License の下で公開しているので自由に使ってください. また,「もっと良いコードの書き方があるだろ!」と思われる方がいれば好きに改変してください.

適当にコメントアウトでコードの作成意図を示しておきました.

それにしてもファイル名がダサいよなぁ.

@echo off
@REM OLD VERSION
@REM Copyright 2021 Yarakashi Kikohshi
@REM Released under the MIT License
@REM https://opensource.org/licenses/mit-license.php
@REM Purpose of this batch script.
@REM Patch of llmk for LaTeX Workshop on Visual Studio Code.
@REM : patchllmk4lw.bat
@REM Eliminate duplicate warnings and pass only warnings
@REM issued in the last build to the LaTeX Workshop.
@REM support llmk version: 0.2.0
set LLMK_LOG=%~n1.llmk.log
set yyyy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%
set hour=%time:~0,2%
set min=%time:~3,2%
set sec=%time:~6,2%
echo.> %LLMK_LOG%
echo DATE: %yyyy% %mm% %dd%>> %LLMK_LOG%
echo TIME: %hour: =0% %min% %sec%>> %LLMK_LOG%
echo.>> %LLMK_LOG%
@REM OUTPUT llmk VERSION
echo ----- ----- llmk VERSION ----- ----->> %LLMK_LOG%
call llmk --version>> %LLMK_LOG%
echo.>> %LLMK_LOG%
@REM RUN llmk WITH VERBOSE OPTION
echo ----- ----- llmk RUN ----- ----->> %LLMK_LOG%
call llmk --verbose %~1>> %LLMK_LOG% 2>&1
@REM SORTING ERROR TYPE
if not errorlevel 1 (
goto SUCCESS_LLMK
) else if %errorlevel% equ 1 (
goto GENERAL_ERROR
) else if %errorlevel% equ 2 (
goto INVOKED_PROGRAM_FAILED
) else if %errorlevel% equ 3 (
goto PARSER_ERROR
) else %errorlevel% equ 4 (
goto TYPE_ERROR
)
:GENERAL_ERROR
echo.>> %LLMK_LOG%
echo llmk info: General Error (Errorlevel: %errorlevel%)>> %LLMK_LOG%
echo ----- ----- ----- ----- ----->> %LLMK_LOG%
goto TYPE_OUTPUT
:INVOKED_PROGRAM_FAILED
echo.>> %LLMK_LOG%
echo llmk info: Invoked Program Error (Errorlevel: %errorlevel%)>> %LLMK_LOG%
echo ----- ----- ----- ----- ----->> %LLMK_LOG%
goto TYPE_OUTPUT
:PARSER_ERROR
echo.>> %LLMK_LOG%
echo llmk info: Parser Error (Errorlevel: %errorlevel%)>> %LLMK_LOG%
echo ----- ----- ----- ----- ----->> %LLMK_LOG%
goto TYPE_OUTPUT
:TYPE_ERROR
echo.>> %LLMK_LOG%
echo llmk info: Type Error (Errorlevel: %errorlevel%)>> %LLMK_LOG%
echo ----- ----- ----- ----- ----->> %LLMK_LOG%
goto TYPE_OUTPUT
:SUCCESS_LLMK
echo.>> %LLMK_LOG%
echo llmk info: Success (Errorlevel: %errorlevel%)>> %LLMK_LOG%
echo ----- ----- ----- ----- ----->> %LLMK_LOG%
goto TYPE_OUTPUT
:TYPE_OUTPUT
@REM SEARCH LAST RUNNING LaTeX COMMAND
for /f "tokens=1 delims=:" %%L in ('findstr /n /c:"llmk info: Running command:" %LLMK_LOG%') do (
set LAST_RUN=%%L
)
set /a DISPLAY_OUTPUT=LAST_RUN-1
@REM TYPE LAST RUNNING LaTeX LOG
echo ----- ----- ----- -----
type %LLMK_LOG% | more +%DISPLAY_OUTPUT%
exit /b
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment