Last active
May 12, 2026 03:47
-
-
Save zr-tex8r/27bc6ddf376d4f716e7276c7dad5ec75 to your computer and use it in GitHub Desktop.
LaTeX: Which kind of “LaTeX” am I using?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| %% | |
| %% This is file 'hello.tex'. | |
| %% | |
| %% Copyright (c) 2018-2026 Takayuki YATO (aka. "ZR") | |
| %% GitHub: https://github.com/zr-tex8r | |
| %% Twitter: @zr_tex8r | |
| %% | |
| %% This file is distributed under the MIT License. | |
| %% | |
| \documentclass[a4paper]{article} | |
| \ProvidesFile{hello.tex}[2026/05/01 v0.4 hello my workflow] | |
| \makeatletter %!!!!!!!!!!!!!!!!!!!!!!!!! TeX code BEGIN | |
| %--------------------------------------- engine check | |
| %% \my@if@primitive | |
| \def\my@if@primitive#1{% | |
| \edef\my@tmpa{\string#1}\edef\my@tmpb{\meaning#1}% | |
| \ifx\my@tmpa\my@tmpb \expandafter\@firstoftwo | |
| \else \expandafter \@secondoftwo \fi} | |
| %% \my@engine : TeX engine type | |
| \let\my@engine=k | |
| \my@if@primitive\pdftexversion{\let\my@engine=P}{} | |
| \my@if@primitive\OmegaVersion{\let\my@engine=o}{} | |
| \my@if@primitive\luatexversion{\let\my@engine=L}{} | |
| \my@if@primitive\XeTeXversion{\let\my@engine=X}{} | |
| \my@if@primitive\kanjiskip{\let\my@engine=p}{} | |
| \my@if@primitive\kchardef{\let\my@engine=u}{} | |
| \my@if@primitive\ngbanner{\let\my@engine=A}{} | |
| \my@if@primitive\jintercharskip{\let\my@engine=j}{} | |
| \my@if@primitive\HINTversion{\let\my@engine=H}{} | |
| \ifx u\my@engine | |
| \ifnum\ucs"3000="3000 \else \let\my@engine=p \fi | |
| \fi | |
| %% \ifmy@pdf | |
| \newif\ifmy@pdf | |
| \@tempcnta\z@ | |
| \my@if@primitive\pdfoutput{\@tempcnta\pdfoutput}{} | |
| \my@if@primitive\outputmode{\@tempcnta\outputmode}{} | |
| \ifnum\@tempcnta>\z@ \my@pdftrue \fi | |
| \if X\my@engine \my@pdftrue \fi | |
| \if A\my@engine \my@pdftrue \fi | |
| %% \my@variant | |
| \let\my@variant\relax | |
| %% LuaTeX variants | |
| \if L\my@engine \ifx\luatexbanner\@undefined\else | |
| \ifx\luaescapestring\@undefined\else | |
| \ifcase\directlua{ | |
| local s = "\luaescapestring{\luatexbanner}" | |
| if s:match("LuajitTeX") then tex.write("1") | |
| elseif s:match("HarfTeX") then tex.write("2") | |
| elseif s:match("LuaHBTeX") then tex.write("3") | |
| elseif s:match("LuajitHBTeX") then tex.write("4") | |
| else tex.write("0") | |
| end}\relax | |
| \or \let\my@engine=I % LuajitTeX | |
| \or \def\my@variant{on Harf\TeX} % HarfTeX | |
| \or \def\my@variant{on LuaHB\TeX} % LuaHBTeX | |
| \or \def\my@variant{on LuajitHB\TeX}\let\my@engine=I | |
| \fi | |
| \fi | |
| \fi\fi | |
| %% XeTeX variants | |
| \if X\my@engine | |
| \my@if@primitive\TectonicCodaTokens{% | |
| \def\my@variant{on Tectonic}% | |
| }{} | |
| \fi | |
| %% \my@lmodern | |
| \if X\my@engine | |
| \IfFileExists{tulmr.fd}{% | |
| \expandafter\ifx\csname T@TU\endcsname\relax | |
| \input{tuenc.def}% | |
| \fi | |
| \def\my@lmodern{\fontencoding{TU}}}% | |
| {%else | |
| \input{eu1enc.def}% | |
| \def\my@lmodern{\fontencoding{EU1}}}% | |
| \g@addto@macro\my@lmodern{\fontfamily{lmr}\selectfont} | |
| \fi | |
| %%<+> \myEngineName | |
| % Prints the name of the *LaTeX* engine in use. | |
| \newcommand*\myEngineName{% | |
| \ifx P\my@engine | |
| \ifmy@pdf pdf\/\fi \LaTeX | |
| \else\ifx o\my@engine Lamed% forget about Lambda | |
| \else\ifx L\my@engine Lua\LaTeX | |
| \else\ifx I\my@engine Luajit\LaTeX | |
| \else\ifx X\my@engine \begingroup | |
| \my@lmodern X\kern-.125em\lower.5ex\hbox{\char"018E}% | |
| \kern-.075em\LaTeX | |
| \endgroup | |
| \else\ifx p\my@engine p\LaTeX | |
| \else\ifx u\my@engine up\LaTeX | |
| \else\ifx A\my@engine Ap\LaTeX | |
| \else\ifx j\my@engine | |
| \leavevmode\lower.5ex\hbox{J}\kern-.1em \LaTeX | |
| \else\ifx H\my@engine Hi\LaTeX | |
| \else \LaTeX % good old... | |
| \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi | |
| \ifx\my@variant\relax\else \ (\my@variant)\fi} | |
| %--------------------------------------- dvips or dvipdfmx | |
| %% \my@hedge | |
| \def\my@hedge{2\paperwidth} | |
| %% \my@ps | |
| \def\my@ps#1{\special{ps:#1}} | |
| %% \my@F | |
| \def\my@F{gsave newpath F grestore 0 () gsave p grestore pop } | |
| %% \my@dvips@or@pdf{<dvips>}{<dvipdfmx>} | |
| \def\my@dvips@or@pdf#1#2{% | |
| \leavevmode | |
| \my@ps{currentpoint pop /F exch def}% | |
| \kern\my@hedge | |
| \my@ps{currentpoint pop \my@F sub /F exch def \my@F neg 0 translate}% | |
| \hb@xt@\z@{#1\hss}% | |
| \kern-\my@hedge \hb@xt@\z@{#2\hss}% | |
| \my@ps{\my@F 0 translate}} | |
| %%<+> \myDviPsOrPdf{<trailer>} | |
| % Prints either 'dvips' or 'dvipdfm' plus the trailer, according | |
| % to the DVI driver actually in use. Note that the reference point | |
| % does not advance. | |
| \newcommand*\myDviPsOrPdf[1]{% | |
| \my@dvips@or@pdf{dvips#1}{dvipdfmx#1}} | |
| %--------------------------------------- main | |
| %%<+> \myWorkflowName{<trailer>} | |
| % Print the name of current workflow, and then insert paragraph break. | |
| \newcommand*\myWorkflowName[1]{% | |
| \myEngineName | |
| \ifmy@pdf #1% | |
| \else \space+\space \myDviPsOrPdf{#1}% | |
| \fi | |
| \par}% avoid the influence of zero-advance | |
| %%<+> \myGreet | |
| % Prints the greeting to the current workflow. | |
| \newcommand*\myGreet{% | |
| \par Hello, \myWorkflowName{!}} | |
| \makeatother %!!!!!!!!!!!!!!!!!!!!!!!!! TeX code END | |
| \begin{document} | |
| \myGreet | |
| \end{document} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment