1499 lines
65 KiB
TeX
1499 lines
65 KiB
TeX
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
%%
|
|
%% This file provides the asmejour class for formatting papers in a layout similar to ASME Journal papers.
|
|
%%
|
|
%% The asmejour.cls file should be used with the files asmejour.bst (for citations) and asmejour-template.tex.
|
|
%%
|
|
%% This file's version and date are:
|
|
\def\versionno{1.26}
|
|
\def\versiondate{2025/04/18\space}
|
|
%%
|
|
%% Author: John H. Lienhard V
|
|
%% Department of Mechanical Engineering
|
|
%% Massachusetts Institute of Technology
|
|
%% Cambridge, MA 02139-4307 USA
|
|
%%
|
|
%% This class was designed to approach the following aims:
|
|
%%
|
|
%% 1. Match ASME's current layout and font specifications
|
|
%% 2. With amsejour.bst, match ASME's reference formats and support DOI & URL fields
|
|
%% 3. Provide hyperref compatibility for hyperlinks, pdf bookmarks, and metadata
|
|
%% 4. Support citations, footnotes, and bold face math in section headings
|
|
%% 5. Provide optional line numbers for editing and review
|
|
%% 6. Support balancing height of columns on the last page
|
|
%% 7. Provide copyright notices for government employees and government contractors
|
|
%% 8. Enable various math features from the newtxmath or unicode-math packages
|
|
%% 9. Support inclusion of passages in languages other than English
|
|
%%
|
|
%% This class is compatible with both pdfLaTeX and LuaLaTeX. All packages required by the class
|
|
%% are in standard distributions, such as TeX Live, and are also available at CTAN (https://ctan.org/).
|
|
%% The use of a complete and up-to-date (Nov. 2022 or later) LaTeX distribution is strongly recommended;
|
|
%% ==> Distributions older than Oct. 2020 are not supported.
|
|
%%
|
|
%% The title block is set by specific commands that are described in the asmejour-template.tex file.
|
|
%%
|
|
%% The class defines abstract environment (with optional keywords) and a nomenclature environment.
|
|
%% (LaTeX must be run twice to align the columns in the nomenclature list).
|
|
%%
|
|
%=========================================================
|
|
%%
|
|
%% LICENSE:
|
|
%%
|
|
%% Copyright (c) 2025 John H. Lienhard
|
|
%%
|
|
%% Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
|
%% associated documentation files (the "Software"), to deal in the Software without restriction,
|
|
%% including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
%% and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
|
%% subject to the following conditions:
|
|
%%
|
|
%% The above copyright notice and this permission notice shall be included in all copies or
|
|
%% substantial portions of the Software.
|
|
%%
|
|
%% The software is provided "as is", without warranty of any kind, express or implied, including but
|
|
%% not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement.
|
|
%% in no event shall the authors or copyright holders be liable for any claim, damages or other liability,
|
|
%% whether in an action of contract, tort or otherwise, arising from, out of or in connection with the
|
|
%% software or the use or other dealings in the software.
|
|
%%
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\NeedsTeXFormat{LaTeX2e}
|
|
\ProvidesClass{asmejour}[\versiondate asmejour paper format (JHL)]
|
|
|
|
\ExplSyntaxOn
|
|
|
|
\cs_if_exist:NT \disable@package@load { \disable@package@load{exscale}{\relax} }
|
|
% stop extarticle from loading exscale: not using CMR + breaks tagging of \section with \mathversion{..}
|
|
|
|
\LoadClass[twoside,9pt]{extarticle}% twocolumn format is initiated by the \maketitle command 2024/07/20
|
|
|
|
\newif\ifasmejour@pdftex
|
|
\newif\ifPDFtex
|
|
\sys_if_engine_pdftex:T {
|
|
\asmejour@pdftextrue
|
|
\PDFtextrue % for end user
|
|
}
|
|
\str_const:Nn \ClassName {asmejour}
|
|
\prop_put:Nnn \g_msg_module_type_prop { \ClassName } { Class }
|
|
\ExplSyntaxOff
|
|
|
|
\RequirePackage{etoolbox}% patch amsmath and section headings
|
|
|
|
|
|
%%%%%%%%%%%%% Some compatibility for older distributions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\providecommand\IfFormatAtLeastTF{\@ifl@t@r\fmtversion}% compare version to date; \If... added to latex 2020/10/01
|
|
\providecommand\IfPackageAtLeastTF{\@ifpackagelater}% compare version to date; \If... added to latex 2020/10/01
|
|
\providecommand\IfPackageLoadedTF{\@ifpackageloaded}% \If...added to latex 2021/11/15
|
|
\providecommand\ClassNoteNoLine[2]{\typeout{^^JClass Note #1: #2.^^J}}% log & terminal note... added to latex 2021/11/15
|
|
|
|
\IfFormatAtLeastTF{2020/10/01}{\relax}{%
|
|
\ClassError{\ClassName}{Your LaTeX format is dated \fmtversion. Formats older than 2020-10-01 will throw errors and may fail entirely! Formats dated 2022-11-01 or later are strongly recommended for the asmejour class.}{Please UPDATE your LaTeX distribution. TeX Live is available for download at no charge: see \string https://www.tug.org/texlive/.}%
|
|
}
|
|
|
|
% Allow pre 2021/11/15 formats to see the graphicx alt= key without causing an error
|
|
\IfFormatAtLeastTF{2021/11/15}{
|
|
\relax
|
|
}{
|
|
\AtBeginDocument{
|
|
\IfPackageLoadedTF{graphicx}{\define@key{Gin}{alt}{}}{\relax}
|
|
}
|
|
}
|
|
|
|
% Enable pre-2020/10 formats to access essential macros later moved into LaTeX kernel
|
|
\ifdefined\NewDocumentCommand\else
|
|
\RequirePackage{xparse}[2020/02/25]
|
|
\fi
|
|
|
|
% kvoptions and fnpos may be loaded as fallbacks for pre-2022/11 formats
|
|
|
|
|
|
%%%%%%%%%%%%%% Options for the class %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\ExplSyntaxOn
|
|
%\debug_on:n {all}
|
|
|
|
\msg_new:nnn { \ClassName } { mainlang } { Selecting~#1~as~the~primary~language }
|
|
\msg_new:nnn { \ClassName } { mathalfa } { Former~mathalfa~option~has~been~dropped;~instead,~load~mathalpha~package~in~your~preamble }
|
|
|
|
\newif\ifasmejour@mainset
|
|
|
|
|
|
\typeout{^^J If~you~see~an~error~"Use~of~\string\???~doesn't~match~its~definition...Misplaced~'='~in~key-value~input",~remove~
|
|
the~deprecated~option~[mathalfa=ccc=ddd]~from~\string\documentclass. ^^J}
|
|
|
|
%% Now create options and keys
|
|
\IfFormatAtLeastTF{2022/11/01}{
|
|
\str_new:N \asmejour@barcolor
|
|
\str_set:Nn \asmejour@barcolor { black }% default
|
|
%
|
|
%% Set main language
|
|
\cs_new:Nn \__asmejour_setupmain:n {
|
|
\PassOptionsToPackage{ main=#1 }{babel}
|
|
\asmejour@mainsettrue
|
|
\msg_term:nnn { \ClassName } { mainlang } {#1}
|
|
}
|
|
\DeclareKeys[\ClassName]
|
|
{
|
|
balance .if = asmejour@balance ,% Option to balance column height on last page [balance]
|
|
balance .usage = load ,
|
|
barcolor .store = \asmejour@barcolor ,% Optional color for vertical bar in title block [barcolor= ], from xcolor package
|
|
barcolor .usage = preamble ,
|
|
captionpatch .if = asmejour@captionpatch ,% Option to patch caption package for tagged pdf [captionpatch]. Experimental, 2025/03/31
|
|
captionpatch .usage = load ,
|
|
contractor .if = asmejour@contractor ,% Option for government contractor copyright notice [contractor]
|
|
contractor .usage = load ,
|
|
govt .if = asmejour@govt ,% Option for copyright notice if all authors are government employees [govt]
|
|
govt .usage = load ,
|
|
govtsome .if = asmejour@govtsome ,% Option for copyright notice if some (not all) authors are government employees [govtsome]
|
|
govtsome .usage = load ,
|
|
lineno .if = asmejour@lineno ,% Option to obtain line numbers [lineno]
|
|
lineno .usage = load ,
|
|
main .code = \__asmejour_setupmain:n { #1 },% Option to set main language (for babel) [main= ]
|
|
main .usage = preamble ,
|
|
mathalfa .code = \msg_warning:nn { \ClassName } { mathalfa },% Warn about old [mathalfa= ] keyvalue; an imperfect fix. 2025/04/01
|
|
mathalfa .usage = load ,
|
|
nocopyright .if = asmejour@nocopyright ,% Option to omit ASME copyright notice [nocopyright]
|
|
nocopyright .usage = load ,
|
|
nofoot .if = asmejour@nofoot ,% Option to omit ASME footers [nofoot]
|
|
nofoot .usage = load ,
|
|
nolists .if = asmejour@nolists ,% Option to omit lists of figures and tables [nolists]
|
|
nolists .usage = load ,
|
|
singlecolumn .if = asmejour@singlecolumn ,% Option for single column layout [singlecolumn]
|
|
singlecolumn .usage = load ,
|
|
}
|
|
\DeclareUnknownKeyHandler[\ClassName]{\relax}% suppress warning about unused keys
|
|
\ProcessKeyOptions
|
|
|
|
}{% And more compatibility code for distributions pre-2022/11
|
|
\RequirePackage{kvoptions}% this package loads kvsetkeys
|
|
\SetupKeyvalOptions{
|
|
family=\ClassName,
|
|
prefix=asmejour@,
|
|
setkeys=\kvsetkeys,
|
|
}
|
|
%% Option to balance column height on last page [balance]
|
|
\DeclareBoolOption{balance}
|
|
%% Option to patch caption package for tagged pdf [captionpatch]. Experimental, 2025/03/31
|
|
\DeclareBoolOption{captionpatch}
|
|
%% Option for government contractor copyright notice [contractor]
|
|
\DeclareBoolOption{contractor}
|
|
%% Option for copyright notice if all authors are government employees [govt]
|
|
\DeclareBoolOption{govt}
|
|
%% Option for copyright notice if some (not all) authors are government employees [govtsome]
|
|
\DeclareBoolOption{govtsome}
|
|
%% Option to obtain line numbers [lineno]
|
|
\DeclareBoolOption{lineno}
|
|
%% Option to omit ASME copyright notice [nocopyright]
|
|
\DeclareBoolOption{nocopyright}
|
|
%% Option to omit ASME footers [nofoot]
|
|
\DeclareBoolOption{nofoot}
|
|
%% Option to omit lists of figures and tables
|
|
\DeclareBoolOption{nolists}
|
|
%% Option for single column layout [singlecolumn], 2024/07/20
|
|
\DeclareBoolOption{singlecolumn}
|
|
|
|
%% set key [barcolor=] to pass a color name defined by xcolor package
|
|
\DeclareStringOption[black]{barcolor}
|
|
|
|
%% the key [main= ] to pass the choice of main language to babel
|
|
\newif\ifasmejour@mainset
|
|
\define@key{\ClassName}{main}{%
|
|
\PassOptionsToPackage{main=#1,#1}{babel}% added #1 resolves conflicts between certain .ldf files under "main=".
|
|
\asmejour@mainsettrue
|
|
\msg_note:nnn { \ClassName } { mainlang } {#1}
|
|
}
|
|
%% the key [mathalfa= ] was dropped with v1.25; instead, load the mathalpha package in your preamble
|
|
\define@key{\ClassName}{mathalfa}{%
|
|
\msg_note:nn { \ClassName } { mathalfa }
|
|
}
|
|
%% Suppress warnings about unused global options, 2021/12/01
|
|
\DeclareDefaultOption{}
|
|
\ProcessKeyvalOptions{\ClassName}
|
|
|
|
%% Turn off these keys now that we're done with them
|
|
\NewDocumentCommand\asmejour@DisableOption{m}{%
|
|
\DisableKeyvalOption[%
|
|
action=ignore,%
|
|
class=\ClassName%
|
|
]{#1}{\asmejour@KeyFamily}%
|
|
}
|
|
\def\asmejour@KeyFamily{}
|
|
\NewDocumentCommand\asmejour@DisableKeys{>{\SplitList{;}}m}{\ProcessList{#1}{\asmejour@DisableOption}}
|
|
\asmejour@DisableKeys{singlecolumn;lineno;balance;nolists;nocopyright;nofoot;govt;govtsome;contractor;barcolor;main;mathalfa}
|
|
}
|
|
|
|
%% if main language was not was chosen explicitly, default to English
|
|
\ifasmejour@mainset\relax\else
|
|
\PassOptionsToPackage{main=english}{babel}%
|
|
\msg_log:nnn { \ClassName } { mainlang } {English}
|
|
\fi
|
|
|
|
\ExplSyntaxOff
|
|
|
|
|
|
%%%%%%%%% Various font-related options %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
%% option for upright integral signs, rather than default slanted integrals, [upint]
|
|
\def\UpInt{}% default slanted integrals in STIX Two Math font with unicode-math
|
|
\DeclareOption{upint}{%
|
|
\ifasmejour@pdftex
|
|
\PassOptionsToPackage{upint}{newtxmath}% this option exists in newtxmath
|
|
\else
|
|
\def\UpInt{+ss08}% upright integrals in STIX Two Math font and Lete Sans Math fonts
|
|
\fi
|
|
}
|
|
|
|
%% Select larger small capitals font from newtxtext, set as default 2025/03/30
|
|
\ifasmejour@pdftex
|
|
\PassOptionsToPackage{largesc=true}{newtxtext}
|
|
\fi
|
|
|
|
%% Option to allow hyphenation of typewriter font [hyphenate]
|
|
\DeclareOption{hyphenate}{%
|
|
\ifasmejour@pdftex
|
|
\PassOptionsToPackage{hyphenate}{inconsolata}% hyphenate is a key via xkeyval in inconsolata
|
|
\ClassNoteNoLine{\ClassName}{Allowing hyphenation of typewriter font}%
|
|
\else
|
|
\ClassWarningNoLine{\ClassName}{The [hyphenate] option is only supported with pdftex. It will be ignored}%
|
|
\fi
|
|
}
|
|
|
|
%% Option to enforce monospacing of words the typewriter font [mono]
|
|
\def\MonoNotMono{WordSpace={1,1,1}}% rescale fontspec's tt font to match pdf tt font, 2024/07/30
|
|
\DeclareOption{mono}{%
|
|
\ifasmejour@pdftex
|
|
\PassOptionsToPackage{mono}{inconsolata}% mono is a key via xkeyval in inconsolata
|
|
\else
|
|
\def\MonoNotMono{WordSpace={1,0,0},PunctuationSpace={3}}% 2024/07/30, these are actually default WordSpace values
|
|
\fi
|
|
}
|
|
|
|
%% Option for unslashed zero typewriter font [var0]
|
|
\def\ssztwo{}% for Inconsolatazi4; default uses slashed zero, +ss02 uses regular zero
|
|
\DeclareOption{var0}{%
|
|
\ifasmejour@pdftex
|
|
\PassOptionsToPackage{var0}{inconsolata}% var0 is a key via xkeyval in inconsolata
|
|
\else
|
|
\def\ssztwo{+ss02}% stylistic alternate for regular zero
|
|
\fi
|
|
}
|
|
|
|
%% Suppress warnings about keys as unused global options
|
|
\DeclareOption*{}
|
|
\ProcessOptions \relax
|
|
|
|
|
|
%%%%%%%%%%%% Page size, bibliography, graphics, color %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\RequirePackage[paperheight=285.7mm, paperwidth=215.900mm, left=21.100mm, right=21.100mm, top=15.9mm, bottom = 24mm, footskip=8mm]{geometry}
|
|
\setlength\columnsep{4.5mm}
|
|
\setlength\parindent{3.5mm}
|
|
%% ASME's pdf pages are 11.25 in. tall, not 11.00 in.
|
|
|
|
\RequirePackage[sort&compress,numbers]{natbib}
|
|
\AtBeginDocument{\def\NAT@space{\relax}}% ASME puts no space between numerical references (2020/04/05)
|
|
\setlength\bibsep{0pt plus 1pt minus 0pt}% ASME keeps this tight
|
|
\renewcommand*{\bibfont}{\footnotesize}
|
|
|
|
\RequirePackage{graphicx}
|
|
\RequirePackage[dvipsnames,svgnames,x11names]{xcolor}% removed obsolete options, 2023/10/23
|
|
|
|
|
|
%%%%%%%%%%%%% Table related %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\RequirePackage{array}
|
|
|
|
\RequirePackage{dcolumn}% column alignment on decimal places
|
|
\newcolumntype{d}[1]{D{.}{.}{#1}}
|
|
% NB: The above conflicts with babel's Spanish language option which makes "." an active character.
|
|
% Instead: use "," as the decimal separator, choose columntype "," (as in "12,234"), and put
|
|
% \newcolumntype{,}[1]{D{,}{,}{#1}} in your preamble.
|
|
|
|
|
|
%% make \hline in tables heavier than default 0.4pt
|
|
\setlength\arrayrulewidth{0.5\p@}
|
|
|
|
%% use double-rules for top and bottom of tables, per ASME style
|
|
\RequirePackage{booktabs}
|
|
\renewcommand*{\toprule}{\specialrule{0.5pt}{0pt}{\doublerulesep}\specialrule{0.5pt}{0pt}{3pt}}
|
|
\renewcommand*{\midrule}{\specialrule{0.5pt}{2pt}{3pt}}
|
|
\renewcommand*{\bottomrule}{\specialrule{0.5pt}{1pt}{\doublerulesep}\specialrule{0.5pt}{0pt}{0pt}}
|
|
|
|
|
|
%%%%%%%%%%%%% Font related %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\RequirePackage{mathtools}% loads and extends amsmath
|
|
\RequirePackage[]{babel}% supports languages other than English, if used.
|
|
|
|
\ifasmejour@pdftex
|
|
\RequirePackage[T1]{fontenc}
|
|
%% ASME word separation is greater than newtxtext defaults so change these parameters.
|
|
%% increased shrink from 0.08, 2021/01/30; add this helvetica scaling 2022/06/26
|
|
\RequirePackage[helvratio=0.91, spacing=0.3em, stretch=0.18em, shrink=0.10em]{newtxtext}% default {0.25em,0.2em,0.1em}
|
|
\RequirePackage[varl,varqu]{inconsolata}% sans typewriter font; restored varl, varqu 2020/08/10
|
|
\RequirePackage[]{newtxmath}
|
|
\RequirePackage{bm}% load after all math for expanded access to bold math
|
|
%
|
|
\else
|
|
% Revised 2025/04/01
|
|
\RequirePackage[warnings-off={mathtools-colon,mathtools-overbracket}]{unicode-math}
|
|
% suppress tiresome warnings about lack of integration between mathtools and unicode-math
|
|
% unicode-math loads the fontspec package
|
|
%
|
|
\def\FontWarning{For luaLaTeX, you MUST have these OpenType fonts installed on your computer: TeX Gyre Termes X, TeX Gyre Termes Math, TeX Gyre Heros, Inconsolatazi4, XTISMath-Bold, LeteSansMath-Bold, LeteSansMath, and STIXTwoMath. All are in TeX Live and CTAN. If you DON'T have these fonts, you will see warning or ERROR messages}
|
|
%
|
|
\IfFontExistsTF{TexGyreTermesX-regular.otf}{}{ \ClassErrorNoLine{\ClassName}{\FontWarning} }
|
|
\IfFontExistsTF{texgyretermes-math.otf}{}{ \ClassErrorNoLine{\ClassName}{\FontWarning} }
|
|
\IfFontExistsTF{texgyreheros-regular.otf}{}{ \ClassErrorNoLine{\ClassName}{\FontWarning} }
|
|
\IfFontExistsTF{Inconsolatazi4-Regular.otf}{}{ \ClassErrorNoLine{\ClassName}{\FontWarning} }
|
|
\IfFontExistsTF{XITSMath-Bold.otf}{}{ \ClassWarningNoLine{\ClassName}{\FontWarning} }
|
|
\IfFontExistsTF{LeteSansMath-Bold.otf}{}{ \ClassWarningNoLine{\ClassName}{\FontWarning} }
|
|
\IfFontExistsTF{LeteSansMath.otf}{}{ \ClassWarningNoLine{\ClassName}{\FontWarning} }
|
|
\IfFontExistsTF{STIXTwoMath-Regular.otf}{}{ \ClassErrorNoLine{\ClassName}{\FontWarning} }
|
|
%
|
|
% The newtx package includes a modified version of TeXGyreTermes called TexGyreTermesX, which could be loaded instead.
|
|
\setmainfont{TeXGyreTermesX}[% Presumes these are system fonts! In CTAN (under the newtx heirarchy)
|
|
WordSpace = {1.20,1.44,1.2},% This stretch matches newtxtext fontdimens (reset 2024/07/30)
|
|
PunctuationSpace = {1.33},% reset 2024/07/30
|
|
Extension = .otf,
|
|
UprightFont = *-Regular,
|
|
ItalicFont = *-Italic,
|
|
BoldFont = *-Bold,
|
|
BoldItalicFont = *-BoldItalic,
|
|
Numbers = Lining,
|
|
]
|
|
\setsansfont{texgyreheros}[% Presumes these are system fonts! Available at: http://www.gust.org.pl/projects/e-foundry/tex-gyre
|
|
WordSpace = {1,1,1.0036},%% This stretch matches newtxtext fontdimens (reset 2024/07/30)
|
|
PunctuationSpace = {1.0036},% reset 2024/07/30
|
|
Scale=0.91,% same as for newtx; former value 0.9 too small 2022/01/15
|
|
Extension = .otf,
|
|
UprightFont = *-regular,
|
|
ItalicFont = *-italic,
|
|
BoldFont = *-bold,
|
|
BoldItalicFont = *-bolditalic,
|
|
Numbers = Lining,
|
|
]
|
|
\setmonofont{Inconsolatazi4}[% This otf font ships with the LaTeX Inconsolata package (it's in TeX Live)
|
|
Scale=1.0,% rescaled 1.05, 2022/03/10; reset to 1 2024/07/30, based on fontdimen6 (and all others!)
|
|
Extension = .otf,
|
|
UprightFont = *-Regular,
|
|
ItalicFont = *-Regular,% has no italic face
|
|
BoldFont = *-Bold,
|
|
BoldItalicFont = *-Bold,% has no italic face
|
|
RawFeature = {+ss01,\ssztwo,-ss03},
|
|
\MonoNotMono,% WordSpace and PunctuationSpace are set in the class option [mono]
|
|
]
|
|
\setmathfont{texgyretermes-math}[% Presumes it's installed! http://www.gust.org.pl/projects/e-foundry/tex-gyre
|
|
Scale=MatchUppercase,
|
|
Extension = .otf,
|
|
]
|
|
\ExplSyntaxOn
|
|
\IfFontExistsTF{XITSMath-Bold.otf}{
|
|
\setmathfont{XITSMath-Bold.otf}[Scale=MatchUppercase,version=bold]% font is missing \cdot U+22C5
|
|
\setmathfontface\mathrm{XITSMath-Bold.otf}[Scale=MatchUppercase,version=bold]
|
|
% the next command added to LaTeX, 2020/10; not clear why /end is required when other begindocument hooks come first
|
|
\AddToHook{begindocument/end}
|
|
{
|
|
\NewCommandCopy{\standardcdot}{\cdot} % thanks to Enrico Gregorio and David Carlisle for this solution
|
|
\cs_set_protected:Npn \cdot
|
|
{
|
|
\str_if_eq:vnTF { math@version } { bold }
|
|
{ \cdotp } % U+00B7
|
|
{ \standardcdot } % U+22C5
|
|
}
|
|
}
|
|
}{
|
|
\ClassWarningNoLine{\ClassName}{XITS Math Bold font not found, falling back to Tex Gyre Termes Math with FakeBold}%
|
|
\setmathfont{texgyretermes-math}[Scale=MatchUppercase,version=bold,FakeBold=3.5]
|
|
\setmathfontface\mathrm{texgyretermes-math}[Scale=MatchUppercase,version=bold,FakeBold=3.5]
|
|
}
|
|
\ExplSyntaxOff
|
|
%
|
|
% set up sans and sansbold math fonts
|
|
\IfFontExistsTF{LeteSansMath-Bold.otf}% the bold version was released a few months after the regular, but we need both.
|
|
{
|
|
\setmathfont{LeteSansMath-Bold}[% In TeX Live. A newer math font (2024/05), boldface sans serif
|
|
Scale=MatchUppercase,
|
|
Extension = .otf,
|
|
RawFeature={\UpInt},
|
|
version=sansbold,
|
|
]
|
|
\setmathfontface\mathrm{LeteSansMath-Bold.otf}[
|
|
Scale=MatchUppercase,
|
|
version=sansbold
|
|
]
|
|
\setmathfont{LeteSansMath}[
|
|
Scale=MatchUppercase,
|
|
Extension = .otf,
|
|
RawFeature={\UpInt},
|
|
version=sans,
|
|
BoldFont = *-Bold,
|
|
NFSSFamily=lsm,
|
|
]
|
|
\setmathfontface\mathrm{LeteSansMath.otf}[
|
|
Scale=MatchUppercase,
|
|
version=sans,
|
|
]
|
|
\setmathfontface\mathbf{LeteSansMath-Bold.otf}[
|
|
Scale=MatchUppercase,
|
|
version=sans,
|
|
]
|
|
\DeclareSymbolFont{lsmgreek}{TU}{lsm}{m}{n}% NFSSFamily lsm set above
|
|
\SetSymbolFont{lsmgreek}{normal}{TU}{lsm}{m}{n}
|
|
\SetSymbolFont{lsmgreek}{bold}{TU}{lsm}{b}{n}% This needs to come before math version bold is declared
|
|
%
|
|
\setmathfont{STIXTwoMath-Regular}[% In TeX Live. Substitution for bigger integrals (similar to newtxmath)
|
|
Extension = .otf,
|
|
Scale=MatchUppercase,
|
|
RawFeature={\UpInt},
|
|
BoldFont=*,
|
|
range={"0222B-"02233,"02A0B-"02A1C,},
|
|
]
|
|
}{
|
|
\ClassWarningNoLine{\ClassName}{Lete Sans Math Bold font not found, falling back to Fira Math with FakeBold}%
|
|
\setmathfont{FiraMath-Regular}[% 2020 version of Regular is in TeX Live
|
|
Scale=MatchUppercase,
|
|
Extension = .otf,
|
|
version=sansbold,
|
|
FakeBold = 4,
|
|
]
|
|
\setmathfontface\mathrm{FiraMath-Regular.otf}[
|
|
Scale=MatchUppercase,
|
|
version=sansbold,
|
|
FakeBold = 4,
|
|
]
|
|
\setmathfont{FiraMath-Regular}[% 2020 version of Regular is in TeX Live
|
|
Scale=MatchUppercase,
|
|
Extension = .otf,
|
|
version=sans,
|
|
NFSSFamily=fsm,
|
|
BoldFont=*,
|
|
BoldFeatures = {FakeBold=4},
|
|
]
|
|
\DeclareSymbolFont{fsmgreek}{TU}{fsm}{m}{n}% NFSSFamily fsm set above
|
|
\SetSymbolFont{fsmgreek}{normal}{TU}{fsm}{m}{n}
|
|
\SetSymbolFont{fsmgreek}{bold}{TU}{fsm}{b}{n}% This needs to come before math version bold is declared
|
|
%
|
|
\setmathfontface\mathrm{FiraMath-Regular.otf}[
|
|
Scale=MatchUppercase,
|
|
version=sans,
|
|
]
|
|
\setmathfontface\mathbf{FiraMath-Regular.otf}[
|
|
Scale=MatchUppercase,
|
|
version=sans,
|
|
FakeBold=4,
|
|
]
|
|
\setmathfont{STIXTwoMath-Regular}[% In TeX Live. Subst. bigger integrals (similar to newtxmath) + cal,scr,frak
|
|
Extension = .otf,
|
|
Scale=MatchUppercase,
|
|
BoldFont = *,
|
|
RawFeature={\UpInt},
|
|
range={"0222B-"02233,"02A0B-"02A1C,frak,bffrak,cal,bfcal,scr,bfscr}
|
|
]
|
|
}
|
|
%
|
|
\setmathfontface\mathsf{texgyreheros-bold.otf}[Scale=0.91,version=sansbold] % for sf
|
|
\setmathfontface\mathit{texgyreheros-bolditalic.otf}[Scale=0.91,version=sansbold] % for it
|
|
\setmathfontface\mathtt{Inconsolatazi4-Bold.otf}[Scale=1.0,version=sansbold] % for tt
|
|
%
|
|
\setmathfontface\mathsf{texgyreheros-regular.otf}[Scale=0.91,version=sans] % for sf
|
|
\setmathfontface\mathit{texgyreheros-italic.otf}[Scale=0.91,version=sans] % for it
|
|
\setmathfontface\mathtt{Inconsolatazi4-Regular.otf}[Scale=1.0,version=sans] % for tt
|
|
%
|
|
\setoperatorfont\normalfont % to enable sans or bold operators, etc.
|
|
\fi
|
|
|
|
%% Relative to size9.clo: leading reduced to 10 pt; displayskips made greater
|
|
\renewcommand\normalsize{%
|
|
\@setfontsize\normalsize\@ixpt{10\p@}% % <== was \@xipt
|
|
\abovedisplayskip 10\p@ \@plus5\p@ \@minus4\p@% % <== was 8\p@ 4,4...
|
|
\abovedisplayshortskip 3\p@ \@plus1\p@ \@minus1\p@% % <== was \z@ \@plus3\p@ (3pt stretch)
|
|
\belowdisplayshortskip 10\p@ \@plus5\p@ \@minus4\p@% % <== was 5\p@ 3, 3
|
|
\belowdisplayskip \abovedisplayskip%
|
|
\let\@listi\@listI}
|
|
\normalsize
|
|
|
|
%% The article class calls \sloppy in two-column mode (\tolerance 9999, \emergencystretch 3em)
|
|
%% These adjustments affect line breaking; the values below are intended to produce
|
|
%% fewer lines with large spaces, without creating the problems of using \fussy in two-column mode.
|
|
\tolerance 2500
|
|
\emergencystretch 3em
|
|
|
|
%% Fonts for author and title only: TeX Gyre Heros Condensed (qhvc, regular is qhv)
|
|
\DeclareFontFamily{T1}{qhvc}{}% qhvc is not TU encoded
|
|
\DeclareFontShape{T1}{qhvc}{m}{n}{<-> s*[0.91] ec-qhvcr}{} %% see t1qhvc.fd; 0.9-->0.94 2022/01/15; 0.94-->0.91 2022/06/26
|
|
\DeclareFontShape{T1}{qhvc}{b}{n}{<-> s*[0.91] ec-qhvcb}{} %% see t1qhvc.fd; 0.9-->0.94 2022/01/15; 0.94-->0.91 2022/06/26
|
|
\newcommand*{\CondSans}{\fontencoding{T1}\fontfamily{qhvc}\selectfont}% remove extra \selectfont, 2023/10/21
|
|
\newcommand*\Condhuge{\@setfontsize\huge{14}{14}} %... for author names only
|
|
\newcommand*{\CondSansBold}{\renewcommand\bfdefault{b}\fontencoding{T1}\fontfamily{qhvc}\selectfont\bfseries}
|
|
\newcommand*\CondHuge{\@setfontsize\Huge{26.5}{26.5}} %... for title only
|
|
|
|
\ifasmejour@pdftex
|
|
%% sans math version, potential value with PGFPlots, etc., 2021/01/25 %%%
|
|
\DeclareMathVersion{sans}
|
|
\SetSymbolFont{letters}{sans}{OML}{ntxsfmi}{m}{it}
|
|
\SetSymbolFont{lettersA}{sans}{U}{ntxsfmia}{m}{it}
|
|
\SetSymbolFont{symbols}{sans}{LMS}{ntxsy}{m}{n}
|
|
\SetSymbolFont{largesymbols}{sans}{LMX}{ntxexx}{m}{n}
|
|
\SetSymbolFont{largesymbolsTXA}{sans}{U}{ntxexa}{m}{n}
|
|
\SetSymbolFont{operators}{sans}{OT1}{\sfdefault}{\rmdefault}{n}% fixed encoding 2025/04/04; fix \rmdefault 2025/04/18
|
|
\SetMathAlphabet{\mathsf}{sans}{\encodingdefault}{\sfdefault}{m}{n}% make upright 2021/01/31.
|
|
%
|
|
%% sans serif italic and sans serif bold italic math
|
|
\DeclareMathVersion{sansbold}
|
|
\SetSymbolFont{letters}{sansbold}{OML}{ntxsfmi}{b}{it}
|
|
\SetSymbolFont{lettersA}{sansbold}{U}{ntxsfmia}{b}{it}
|
|
\SetSymbolFont{symbols}{sansbold}{LMS}{ntxsy}{b}{n}
|
|
\SetSymbolFont{largesymbols}{sansbold}{LMX}{ntxexx}{b}{n}% added 2021/01/26
|
|
\SetSymbolFont{largesymbolsTXA}{sansbold}{U}{ntxexa}{b}{n}% added 2021/01/26
|
|
\SetSymbolFont{operators}{sansbold}{OT1}{\sfdefault}{\bfdefault}{n}% fixed encoding 2025/04/04
|
|
\SetMathAlphabet{\mathsf}{sansbold}{\encodingdefault}{\sfdefault}{b}{n}% \mathsf is upright
|
|
%
|
|
\fi
|
|
|
|
%%%%%%%%%%%%%% Sans serif upright greek and sans mathversion %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% revised 2025/04/17
|
|
%
|
|
\ifasmejour@pdftex
|
|
%% Provide sans-serif *upright* Greek letters, following a suggestion by Michael Sharpe (March 2019).
|
|
%% Following Sharpe's newtxsf implementation of the STIX fonts, under the LaTeX Project Public License.
|
|
%% (Note that \mathversion{sansbold} provides sans-serif *italic* Greek letters.)
|
|
\DeclareSymbolFont{lettersAB}{U}{ntxsfmia}{m}{it}
|
|
\SetSymbolFont{lettersAB}{normal}{U}{ntxsfmia}{m}{it}
|
|
\SetSymbolFont{lettersAB}{bold}{U}{ntxsfmia}{b}{it}
|
|
\SetSymbolFont{lettersAB}{sans}{U}{ntxsfmia}{m}{it}
|
|
\SetSymbolFont{lettersAB}{sansbold}{U}{ntxsfmia}{b}{it}
|
|
|
|
\DeclareMathSymbol{\sfGamma}{\mathalpha}{lettersAB}{0}% adjust to avoid overwriting newtxmath commands, 2021/01/25
|
|
\DeclareMathSymbol{\sfDelta}{\mathalpha}{lettersAB}{1}
|
|
\DeclareMathSymbol{\sfTheta}{\mathalpha}{lettersAB}{2}
|
|
\DeclareMathSymbol{\sfLambda}{\mathalpha}{lettersAB}{3}
|
|
\DeclareMathSymbol{\sfXi}{\mathalpha}{lettersAB}{4}
|
|
\DeclareMathSymbol{\sfPi}{\mathalpha}{lettersAB}{5}
|
|
|
|
\DeclareMathSymbol{\sfSigma}{\mathalpha}{lettersAB}{6}
|
|
\DeclareMathSymbol{\sfUpsilon}{\mathalpha}{lettersAB}{7}
|
|
\DeclareMathSymbol{\sfPhi}{\mathalpha}{lettersAB}{8}
|
|
\DeclareMathSymbol{\sfPsi}{\mathalpha}{lettersAB}{9}
|
|
\DeclareMathSymbol{\sfOmega}{\mathalpha}{lettersAB}{10}
|
|
|
|
\DeclareMathSymbol{\sfalpha}{\mathalpha}{lettersAB}{11}
|
|
\DeclareMathSymbol{\sfbeta}{\mathalpha}{lettersAB}{12}
|
|
\DeclareMathSymbol{\sfgamma}{\mathalpha}{lettersAB}{13}
|
|
\DeclareMathSymbol{\sfdelta}{\mathalpha}{lettersAB}{14}
|
|
\DeclareMathSymbol{\sfepsilon}{\mathalpha}{lettersAB}{15}
|
|
|
|
\DeclareMathSymbol{\sfzeta}{\mathalpha}{lettersAB}{16}
|
|
\DeclareMathSymbol{\sfeta}{\mathalpha}{lettersAB}{17}
|
|
\DeclareMathSymbol{\sftheta}{\mathalpha}{lettersAB}{18}
|
|
\DeclareMathSymbol{\sfiota}{\mathalpha}{lettersAB}{19}
|
|
\DeclareMathSymbol{\sfkappa}{\mathalpha}{lettersAB}{20}
|
|
|
|
\DeclareMathSymbol{\sflambda}{\mathalpha}{lettersAB}{21}
|
|
\DeclareMathSymbol{\sfmu}{\mathalpha}{lettersAB}{22}
|
|
\DeclareMathSymbol{\sfnu}{\mathalpha}{lettersAB}{23}
|
|
\DeclareMathSymbol{\sfxi}{\mathalpha}{lettersAB}{24}
|
|
\DeclareMathSymbol{\sfpi}{\mathalpha}{lettersAB}{25}
|
|
|
|
\DeclareMathSymbol{\sfrho}{\mathalpha}{lettersAB}{26}
|
|
\DeclareMathSymbol{\sfsigma}{\mathalpha}{lettersAB}{27}
|
|
\DeclareMathSymbol{\sftau}{\mathalpha}{lettersAB}{28}
|
|
\DeclareMathSymbol{\sfupsilon}{\mathalpha}{lettersAB}{29}
|
|
\DeclareMathSymbol{\sfphi}{\mathalpha}{lettersAB}{30}
|
|
|
|
\DeclareMathSymbol{\sfchi}{\mathalpha}{lettersAB}{31}
|
|
\DeclareMathSymbol{\sfpsi}{\mathalpha}{lettersAB}{32}
|
|
\DeclareMathSymbol{\sfomega}{\mathalpha}{lettersAB}{33}
|
|
\DeclareMathSymbol{\sfvarepsilon}{\mathalpha}{lettersAB}{34}
|
|
\DeclareMathSymbol{\sfvartheta}{\mathalpha}{lettersAB}{35}
|
|
|
|
\DeclareMathSymbol{\sfvarpi}{\mathord}{lettersAB}{36}% added these 2021/01/25
|
|
\DeclareMathSymbol{\sfvarrho}{\mathord}{lettersAB}{37}
|
|
\DeclareMathSymbol{\sfvarsigma}{\mathord}{lettersAB}{38}
|
|
\DeclareMathSymbol{\sfvarphi}{\mathord}{lettersAB}{39}
|
|
\DeclareMathSymbol{\sfitvarkappa}{\mathalpha}{lettersAB}{40}
|
|
\DeclareMathSymbol{\sfvarkappa}{\mathalpha}{lettersAB}{40}
|
|
\DeclareMathSymbol{\sfitnabla}{\mathalpha}{lettersAB}{42}
|
|
\DeclareMathSymbol{\sfnabla}{\mathalpha}{lettersAB}{43}
|
|
\DeclareMathSymbol{\sfhslash}{\mathalpha}{lettersAB}{52}% this is not upright
|
|
\DeclareMathSymbol{\sfhbar}{\mathalpha}{lettersAB}{53}% this is not upright
|
|
\else
|
|
\IfFontExistsTF{LeteSansMath-Bold}
|
|
{
|
|
\def\ac@sansgreek{\symlsmgreek}
|
|
}{
|
|
\def\ac@sansgreek{\symfsmgreek}
|
|
}
|
|
% uppercase greek
|
|
\Umathchardef\sfAlpha="0 \ac@sansgreek "0391
|
|
\Umathchardef\sfBeta="0 \ac@sansgreek "0392
|
|
\Umathchardef\sfGamma="0 \ac@sansgreek "0393
|
|
\Umathchardef\sfDelta="0 \ac@sansgreek "0394
|
|
\Umathchardef\sfEpsilon="0 \ac@sansgreek "0395
|
|
\Umathchardef\sfZeta="0 \ac@sansgreek "0396
|
|
\Umathchardef\sfEta="0 \ac@sansgreek "0397
|
|
\Umathchardef\sfTheta="0 \ac@sansgreek "0398
|
|
\Umathchardef\sfIota="0 \ac@sansgreek "0399
|
|
\Umathchardef\sfKappa="0 \ac@sansgreek "039A
|
|
\Umathchardef\sfLambda="0 \ac@sansgreek "039B
|
|
\Umathchardef\sfMu="0 \ac@sansgreek "039C
|
|
\Umathchardef\sfNu="0 \ac@sansgreek "039D
|
|
\Umathchardef\sfXi="0 \ac@sansgreek "039E
|
|
\Umathchardef\sfOmicron="0 \ac@sansgreek "039F
|
|
\Umathchardef\sfPi="0 \ac@sansgreek "03A0
|
|
\Umathchardef\sfRho="0 \ac@sansgreek "03A1
|
|
\Umathchardef\sfSigma="0 \ac@sansgreek "03A3
|
|
\Umathchardef\sfTau="0 \ac@sansgreek "03A4
|
|
\Umathchardef\sfUpsilon="0 \ac@sansgreek "03A5
|
|
\Umathchardef\sfPhi="0 \ac@sansgreek "03A6
|
|
\Umathchardef\sfChi="0 \ac@sansgreek "03A7
|
|
\Umathchardef\sfPsi="0 \ac@sansgreek "03A8
|
|
\Umathchardef\sfOmega="0 \ac@sansgreek "03A9
|
|
%
|
|
% lowercase greek, upright forms selected
|
|
\Umathchardef\sfalpha="0 \ac@sansgreek "03B1
|
|
\Umathchardef\sfbeta="0 \ac@sansgreek "03B2
|
|
\Umathchardef\sfgamma="0 \ac@sansgreek "03B3
|
|
\Umathchardef\sfdelta="0 \ac@sansgreek "03B4
|
|
\Umathchardef\sfvarepsilon="0 \ac@sansgreek "03B5 % see note below
|
|
\Umathchardef\sfzeta="0 \ac@sansgreek "03B6
|
|
\Umathchardef\sfeta="0 \ac@sansgreek "03B7
|
|
\Umathchardef\sftheta="0 \ac@sansgreek "03B8
|
|
\Umathchardef\sfiota="0 \ac@sansgreek "03B9
|
|
\Umathchardef\sfkappa="0 \ac@sansgreek "03BA
|
|
\Umathchardef\sflambda="0 \ac@sansgreek "03BB
|
|
\Umathchardef\sfmu="0 \ac@sansgreek "03BC
|
|
\Umathchardef\sfnu="0 \ac@sansgreek "03BD
|
|
\Umathchardef\sfxi="0 \ac@sansgreek "03BE
|
|
\Umathchardef\sfomicron="0 \ac@sansgreek "03BF
|
|
\Umathchardef\sfpi="0 \ac@sansgreek "03C0
|
|
\Umathchardef\sfrho="0 \ac@sansgreek "03C1
|
|
\Umathchardef\sfvarsigma="0 \ac@sansgreek "03C2
|
|
\Umathchardef\sfsigma="0 \ac@sansgreek "03C3
|
|
\Umathchardef\sftau="0 \ac@sansgreek "03C4
|
|
\Umathchardef\sfupsilon="0 \ac@sansgreek "03C5
|
|
\Umathchardef\sfphi="0 \ac@sansgreek "03C6
|
|
\Umathchardef\sfchi="0 \ac@sansgreek "03C7
|
|
\Umathchardef\sfpsi="0 \ac@sansgreek "03C8
|
|
\Umathchardef\sfomega="0 \ac@sansgreek "03C9
|
|
%
|
|
% character variants
|
|
\Umathchardef\sfvartheta="0 \ac@sansgreek "03D1
|
|
\Umathchardef\sfvarphi="0 \ac@sansgreek "03D5
|
|
\Umathchardef\sfvarpi="0 \ac@sansgreek "03D6
|
|
\Umathchardef\sfvarkappa="0 \ac@sansgreek "03F0
|
|
\Umathchardef\sfvarrho="0 \ac@sansgreek "03F1
|
|
\Umathchardef\sfvarTheta="0 \ac@sansgreek "03F4
|
|
\Umathchardef\sfepsilon="0 \ac@sansgreek "03F5 % this is the lunate form
|
|
%
|
|
% uppercase bold greek
|
|
\Umathchardef\sfbfAlpha="0 \ac@sansgreek "1D6A8
|
|
\Umathchardef\sfbfBeta="0 \ac@sansgreek "1D6A9
|
|
\Umathchardef\sfbfGamma="0 \ac@sansgreek "1D6AA
|
|
\Umathchardef\sfbfDelta="0 \ac@sansgreek "1D6AB
|
|
\Umathchardef\sfbfEpsilon="0 \ac@sansgreek "1D6AC
|
|
\Umathchardef\sfbfZeta="0 \ac@sansgreek "1D6AD
|
|
\Umathchardef\sfbfEta="0 \ac@sansgreek "1D6AE
|
|
\Umathchardef\sfbfTheta="0 \ac@sansgreek "1D6AF
|
|
\Umathchardef\sfbfIota="0 \ac@sansgreek "1D6B0
|
|
\Umathchardef\sfbfKappa="0 \ac@sansgreek "1D6B1
|
|
\Umathchardef\sfbfLambda="0 \ac@sansgreek "1D6B2
|
|
\Umathchardef\sfbfMu="0 \ac@sansgreek "1D6B3
|
|
\Umathchardef\sfbfNu="0 \ac@sansgreek "1D6B4
|
|
\Umathchardef\sfbfXi="0 \ac@sansgreek "1D6B5
|
|
\Umathchardef\sfbfOmicron="0 \ac@sansgreek "1D6B6
|
|
\Umathchardef\sfbfPi="0 \ac@sansgreek "1D6B7
|
|
\Umathchardef\sfbfRho="0 \ac@sansgreek "1D6B8
|
|
\Umathchardef\sfbfvarTheta="0 \ac@sansgreek "1D6B9
|
|
\Umathchardef\sfbfSigma="0 \ac@sansgreek "1D6BA
|
|
\Umathchardef\sfbfTau="0 \ac@sansgreek "1D6BB
|
|
\Umathchardef\sfbfUpsilon="0 \ac@sansgreek "1D6BC
|
|
\Umathchardef\sfbfPhi="0 \ac@sansgreek "1D6BD
|
|
\Umathchardef\sfbfChi="0 \ac@sansgreek "1D6BE
|
|
\Umathchardef\sfbfPsi="0 \ac@sansgreek "1D6BF
|
|
\Umathchardef\sfbfOmega="0 \ac@sansgreek "1D6C0
|
|
%
|
|
% lowercase bold greek, upright forms selected
|
|
\Umathchardef\sfbfalpha="0 \ac@sansgreek "1D6C2
|
|
\Umathchardef\sfbfbeta="0 \ac@sansgreek "1D6C3
|
|
\Umathchardef\sfbfgamma="0 \ac@sansgreek "1D6C4
|
|
\Umathchardef\sfbfdelta="0 \ac@sansgreek "1D6C5
|
|
\Umathchardef\sfbfvarepsilon="0 \ac@sansgreek "1D6C6 % see note below
|
|
\Umathchardef\sfbfzeta="0 \ac@sansgreek "1D6C7
|
|
\Umathchardef\sfbfeta="0 \ac@sansgreek "1D6C8
|
|
\Umathchardef\sfbftheta="0 \ac@sansgreek "1D6C9
|
|
\Umathchardef\sfbfiota="0 \ac@sansgreek "1D6CA
|
|
\Umathchardef\sfbfkappa="0 \ac@sansgreek "1D6CB
|
|
\Umathchardef\sfbflambda="0 \ac@sansgreek "1D6CC
|
|
\Umathchardef\sfbfmu="0 \ac@sansgreek "1D6CD
|
|
\Umathchardef\sfbfnu="0 \ac@sansgreek "1D6CE
|
|
\Umathchardef\sfbfxi="0 \ac@sansgreek "1D6CF
|
|
\Umathchardef\sfbfomicron="0 \ac@sansgreek "1D6D0
|
|
\Umathchardef\sfbfpi="0 \ac@sansgreek "1D6D1
|
|
\Umathchardef\sfbfrho="0 \ac@sansgreek "1D6D2
|
|
\Umathchardef\sfbfvarsigma="0 \ac@sansgreek "1D6D3
|
|
\Umathchardef\sfbfsigma="0 \ac@sansgreek "1D6D4
|
|
\Umathchardef\sfbftau="0 \ac@sansgreek "1D6D5
|
|
\Umathchardef\sfbfupsilon="0 \ac@sansgreek "1D6D6
|
|
\Umathchardef\sfbfphi="0 \ac@sansgreek "1D6D7
|
|
\Umathchardef\sfbfchi="0 \ac@sansgreek "1D6D8
|
|
\Umathchardef\sfbfpsi="0 \ac@sansgreek "1D6D9
|
|
\Umathchardef\sfbfomega="0 \ac@sansgreek "1D6DA
|
|
%
|
|
% character variants, bold
|
|
\Umathchardef\sfbfepsilon="0 \ac@sansgreek "1D6DC % this is the lunate form
|
|
\Umathchardef\sfbfvartheta="0 \ac@sansgreek "1D6DD
|
|
\Umathchardef\sfbfvarkappa="0 \ac@sansgreek "1D6DE
|
|
\Umathchardef\sfbfvarphi="0 \ac@sansgreek "1D6DF
|
|
\Umathchardef\sfbfvarrho="0 \ac@sansgreek "1D6E0
|
|
\Umathchardef\sfbfvarpi="0 \ac@sansgreek "1D6E1
|
|
\fi
|
|
|
|
% and a simple cheat to avoid errors when switching from luatex to pdftex with the template example
|
|
\providecommand*\mitDelta{\Delta}
|
|
|
|
|
|
%%%%%%%%%%%%%%%%% Some adjustments to math layout %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\setlength{\jot}{10pt}% <== default is 3pt
|
|
|
|
%% multline has an extra \jot above it, so subtract from \abovedisplayskip to remove imbalance
|
|
%% see: https://tex.stackexchange.com/a/637071/119566
|
|
|
|
\AddToHook{env/multline/begin}{\addtolength\abovedisplayskip{-10pt}}% 2025/04/06 increase to 10pt from 7pt, use hooks rather than etoolbox
|
|
\AddToHook{env/multline/end}{\addtolength\abovedisplayskip{+10pt}}
|
|
|
|
|
|
%%%%%%%%%%%%%%%%% Equation and Line Numbering %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
%% ASME puts equation tags in blue
|
|
\patchcmd{\tagform@}{(\ignorespaces#1\unskip\@@italiccorr)}{\color{blue}(\ignorespaces#1\unskip\@@italiccorr)}{}{}
|
|
|
|
% To free \eqref from the normal font (e.g., for use in section headings or captions). Revised 2024/07/28
|
|
\renewcommand{\eqref}[1]{\textup{\hbox{\m@th{(\ignorespaces\ref{#1}\unskip\@@italiccorr)}}}}
|
|
%
|
|
% amsmath def: \newcommand{\eqref}[1]{\textup{\tagform@{\ref{#1}}}}
|
|
% \def\tagform@#1{\maketag@@@{(\ignorespaces#1\unskip\@@italiccorr)}}
|
|
% \def\maketag@@@#1{\hbox{\m@th\normalfont#1}}
|
|
|
|
%% Italicize alph part of subequation numbers. Revised 2023/10/20
|
|
\patchcmd{\subequations}{\theparentequation\alph{equation}}{\theparentequation\itshape\alph{equation}}{}{}
|
|
|
|
|
|
%%%%% lineno related %%%%
|
|
|
|
\ifasmejour@lineno
|
|
\RequirePackage[switch,mathlines]{lineno}%
|
|
\renewcommand{\linenumberfont}{\normalfont\scriptsize\color{red}}%
|
|
\AtBeginDocument{\linenumbers}%
|
|
\ifasmejour@balance
|
|
\ClassWarningNoLine{\ClassName}{Package lineno loaded, so final column balancing will be disabled}%
|
|
\fi
|
|
%%% Patch to allow line numbering in AMS math environments.
|
|
%%% This patch is for lineno versions earlier than v5.2 [2023/05/19]. As of mid-2023, the lineno package
|
|
%%% has been corrected to account for the AMS math environments. Retaining temporarily for backward compatibility.
|
|
%%% postdisplaypenalty adjusted to avoid extra line number at end, see: https://tex.stackexchange.com/a/461192/
|
|
\IfPackageAtLeastTF{lineno}{2023/05/19}{\relax}{
|
|
\NewDocumentCommand{\asmejour@losepostpenalty}{}{\patchcmd{\linenomathWithnumbers}{\advance\postdisplaypenalty\linenopenalty}{}{}{}}
|
|
%
|
|
\NewDocumentCommand{\asmejour@FixAMSMath}{m}{%
|
|
\AtBeginEnvironment{#1}{\asmejour@losepostpenalty\linenomath}%
|
|
\AtEndEnvironment{#1}{\endlinenomath}%
|
|
\AtBeginEnvironment{#1*}{\asmejour@losepostpenalty\linenomath}%
|
|
\AtEndEnvironment{#1*}{\endlinenomath}%
|
|
}
|
|
\NewDocumentCommand{\asmejour@FixAll}{>{\SplitList{;}}m}{\ProcessList{#1}{\asmejour@FixAMSMath}}
|
|
\asmejour@FixAll{align;alignat;gather;flalign;multline}
|
|
}
|
|
%
|
|
\else
|
|
\ProvideDocumentEnvironment{linenomath}{}{}{}%
|
|
\ifasmejour@balance % balancing by flushend can produce weird errors.
|
|
\RequirePackage{flushend}% flushend package is NOT compatible with lineno.
|
|
\AtEndDocument{\flushcolsend}%
|
|
\ClassNoteNoLine{\ClassName}{Calling flushend package to balance column height on last page}%
|
|
\fi%
|
|
\fi
|
|
|
|
\providecommand{\@LN@col}[1]{\relax}% avoid errors in the aux file when lineno is dropped
|
|
\providecommand{\@LN}[2]{\relax}
|
|
|
|
%% ASME page proofs seem to align the line number at top of the line, rather than bottom as done here.
|
|
|
|
|
|
%%%%%%%%%%%%%%%%% Footer Set Up %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
%%%%%%%%%%%%%%%%% footer text names %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\newcommand{\JourName}[1]{\gdef\@JourName{#1}}
|
|
\providecommand\@JourName{\hbox{ }}
|
|
|
|
\NewDocumentCommand{\PaperYear}{m}{%
|
|
\gdef\@PaperYear{#1}%
|
|
}
|
|
\providecommand\@PaperYear{\the\year}
|
|
|
|
\def\@PreprintStringL{PREPRINT}% updated 2024/07/24
|
|
\def\@PreprintStringR{PREPRINT}
|
|
|
|
\NewDocumentCommand{\PreprintString}{m o}{%
|
|
\IfNoValueTF{#2}{%
|
|
\gdef\@PreprintStringL{#1}%
|
|
\gdef\@PreprintStringR{#1}%
|
|
}{%
|
|
\ifx R#2{\gdef\@PreprintStringR{#1}}\fi
|
|
\ifx L#2{\gdef\@PreprintStringL{#1}}\fi
|
|
}
|
|
}
|
|
|
|
\newcommand{\PaperNumber}[1]{\gdef\@PaperNumber{#1-}}
|
|
\providecommand\@PaperNumber{\relax}
|
|
|
|
%%%%%% Fancyhdr %%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\RequirePackage{fancyhdr}% options revised 2024/07/23
|
|
\pagestyle{fancy}
|
|
|
|
\fancyhf{}% clear all header and footer fields
|
|
\renewcommand{\headrulewidth}{0pt}
|
|
\renewcommand{\footrulewidth}{0pt}
|
|
\ifasmejour@nofoot
|
|
\fancyfoot[CE,CO]{\thepage}
|
|
\else
|
|
\fancyfoot[RE]{\large\bfseries\sffamily Transactions of the ASME}
|
|
\fancyfoot[LO]{\large\bfseries\sffamily Journal of \@JourName}
|
|
\fancyfoot[RO]{\large\sffamily \@PreprintStringR\space\space\bfseries/\space\space\@PaperNumber\thepage}
|
|
\fancyfoot[LE]{\large\sffamily {\bfseries \@PaperNumber\thepage\space\space/}\space\space\@PreprintStringL\ }
|
|
\fi
|
|
|
|
\fancypagestyle{title}{% is an odd page
|
|
\fancyhf{}% clear all header and footer fields
|
|
\renewcommand{\headrulewidth}{0pt}
|
|
\renewcommand{\footrulewidth}{0pt}
|
|
\ifasmejour@nofoot
|
|
\fancyfoot[CO]{\thepage}
|
|
\else
|
|
\fancyfoot[RO]{\large\sffamily \@PreprintStringR\space\space\bfseries/\space\space\@PaperNumber\thepage}
|
|
\fancyfoot[LO]{\large\bfseries\sffamily Journal of \@JourName}
|
|
\ifasmejour@nocopyright
|
|
\fancyfoot[CO]{}
|
|
\else
|
|
\fancyfoot[CO]{\large\bfseries\sffamily Copyright \textcopyright\ \@PaperYear\ by ASME}
|
|
\fi
|
|
\fi
|
|
}
|
|
|
|
%%%%%% Footnotes %%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\RequirePackage{footmisc}%
|
|
\IfPackageAtLeastTF{footmisc}{2022/02/05}{
|
|
\PassOptionsToPackage{belowfloats}{footmisc}%
|
|
}{ \RequirePackage{fnpos}
|
|
\makeFNbottom
|
|
\makeFNbelow
|
|
}%
|
|
\setlength\footnotemargin{4mm}% reduce indentation of footnotes, from footmisc
|
|
\setlength{\skip\footins}{12pt plus 2pt minus 1pt}
|
|
|
|
\renewcommand{\footnoterule}{%
|
|
\kern -3pt
|
|
\hrule width 0.5in height 0.5pt
|
|
\kern 2pt
|
|
}
|
|
|
|
%% Produces an unmarked footnote about the revision date.
|
|
%% This command is invoked by \date as part of \maketitle below.
|
|
%% Text can be anything given as the argument to \date{..}.
|
|
\NewDocumentCommand{\revfootnote}{m}{\begin{NoHyper}\def\@thefnmark{}\@footnotetext{\hspace{-3pt}#1}\end{NoHyper}}% \gdef -->\def 2021/12/23
|
|
|
|
%% The above has been offset per style and modified to eliminate missing anchor warning from hyperref that the following \def would cause
|
|
%%\def\revfootnote{\gdef\@thefnmark{}\@footnotetext}
|
|
|
|
|
|
%% include a comma for sequential footnotes
|
|
\ExplSyntaxOn
|
|
\cs_new:Npn \__asmejour_NoteComma:n { \peek_meaning:NT \footnote { \textsuperscript{\mdseries,} } }
|
|
\cs_new_eq:NN \__asmejour_savefootnote \footnote
|
|
\cs_gset_protected:Npn \footnote #1 { \__asmejour_savefootnote{#1}\__asmejour_NoteComma:n }
|
|
\ExplSyntaxOff
|
|
|
|
|
|
%%%%%%%%% Caption Related %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\RequirePackage[labelfont={sf,bf},hypcap=false]{caption}
|
|
\RequirePackage[hypcap=false,list=true]{subcaption}
|
|
|
|
%% This option is experimental and documented only here, 2025/04/01.
|
|
%% purpose is to allow tagged pdf based on current latex-lab code.
|
|
%% subcaptions are not specifically addressed in this patch.
|
|
%% babel [spanish] option is NOT compatible with tagging.
|
|
\ifasmejour@captionpatch
|
|
%% see github discussion of this patch by Ulrike Fischer
|
|
%% https://github.com/latex3/tagging-project/issues/720#issuecomment-2386568711
|
|
\ExplSyntaxOn
|
|
\IfPackageLoadedTF{tagpdf}{% this test may need to be removed once latex-lab moves to kernel code
|
|
\RemoveFromHook{begindocument}[latex-lab-testphase-float]
|
|
\socket_new_plug:nnn{tagsupport/parbox/before}{caption}
|
|
{
|
|
\tagpdfparaOn %restart para tagging
|
|
\tl_if_empty:NTF\@current@float@struct
|
|
{
|
|
\tag_struct_begin:n{tag=Caption,firstkid}
|
|
}
|
|
{
|
|
\tag_struct_begin:n{tag=Caption,parent=\@current@float@struct,firstkid}
|
|
}
|
|
}
|
|
\socket_new_plug:nnn{tagsupport/parbox/after}{caption}
|
|
{
|
|
\tag_struct_end:
|
|
}
|
|
\l@addto@macro\caption@beginex@hook{%
|
|
\tagpdfparaOff %leavevmode in parbox should not start paragraph structure
|
|
\AssignSocketPlug{tagsupport/parbox/before}{caption}
|
|
\AssignSocketPlug{tagsupport/parbox/after}{caption}}
|
|
}{}
|
|
\ExplSyntaxOff
|
|
\fi
|
|
|
|
\DeclareCaptionTextFormat{boldmath}{\mathversion{sansbold}#1}
|
|
\DeclareCaptionTextFormat{sansmath}{\mathversion{sans}#1}% ASME's subcaptions actually do not allow math...
|
|
|
|
\captionsetup[figure]{labelfont={sf,bf},textfont={sf,bf},textformat=boldmath,labelsep=quad}
|
|
\captionsetup[table]{labelfont={sf,bf},textfont={sf,bf},textformat=boldmath,labelsep=quad,skip=0.5\baselineskip}
|
|
|
|
%% 2021/01/30: ASME only labels subfigures with a sans serif, italic (a), (b),... no caption text or math, no bold face.
|
|
\captionsetup[subfigure]{labelfont={sf},textfont={sf},textformat=sansmath,labelformat=simple}% default: =parens
|
|
\renewcommand\thesubfigure{(\textit{\alph{subfigure}})}
|
|
|
|
\captionsetup[subtable]{labelfont={sf},textfont={sf},textformat=sansmath,labelformat=simple}
|
|
\renewcommand\thesubtable{(\textit{\alph{subtable}})}
|
|
|
|
|
|
%%%%%%%%%%%% Section Headings %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
% Revised 2025/03/30, removing titlesec package
|
|
|
|
\renewcommand\section{\@startsection {section}{1}{\z@}%
|
|
{14pt \@plus 3pt \@minus 2pt}%
|
|
{3pt \@plus 2pt \@minus 1pt}%
|
|
{\mathversion{bold}\bfseries\large\raggedright}}
|
|
\renewcommand\subsection{\@startsection {subsection}{2}{3.5mm}%
|
|
{12pt \@plus 3pt \@minus 2pt}%
|
|
{-0.5em}%
|
|
{\mathversion{bold}\normalsize\bfseries\raggedright}}
|
|
\renewcommand\subsubsection{\@startsection {subsubsection}{3}{3.5mm}%
|
|
{12pt \@plus 3pt \@minus 2pt}%
|
|
{-0.5em}%
|
|
{\itshape\normalsize}}
|
|
\patchcmd{\thesection}{\@arabic\c@section}{\@arabic\c@section}{}{}
|
|
\patchcmd{\thesubsection}{\thesection.\@arabic\c@subsection}{\@arabic\c@section.\@arabic\c@subsection}{}{}
|
|
\patchcmd{\@seccntformat}{\quad}{\hspace*{1em}}{}{}
|
|
\let\paragraph\subsubsection
|
|
|
|
% Insert period at end of subsection and subsubsection titles
|
|
% ...would prefer a more streamlined approach, but there's no simple hook for #8 in \section.
|
|
\let\oldsubsection\subsection
|
|
\RenewDocumentCommand{\subsection}{s o m}{%
|
|
\IfBooleanTF{#1} % starred version
|
|
{\IfNoValueTF{#2}
|
|
{\oldsubsection*{#3.}} % no optional arg
|
|
{\oldsubsection*[#2]{#3.}}%
|
|
}
|
|
{\IfNoValueTF{#2}
|
|
{\oldsubsection{#3.}} % no optional arg
|
|
{\oldsubsection[#2]{#3.}}%
|
|
}%
|
|
}
|
|
\let\oldsubsubsection\subsubsection
|
|
\RenewDocumentCommand{\subsubsection}{s o m}{%
|
|
\IfBooleanTF{#1} % starred version
|
|
{\IfNoValueTF{#2}
|
|
{\oldsubsubsection*{#3.}} % no optional arg
|
|
{\oldsubsubsection*[#2]{#3.}}%
|
|
}
|
|
{\IfNoValueTF{#2}
|
|
{\oldsubsubsection{#3.}} % no optional arg
|
|
{\oldsubsubsection[#2]{#3.}}%
|
|
}%
|
|
}
|
|
|
|
% Special handling of the appendices
|
|
% Assumes that appendices are the last technical content in paper
|
|
% Tagging code, if loaded, uses \@kernel@tag@hangfrom
|
|
\ExplSyntaxOn
|
|
\cs_new_protected:Nn \__asmejour_change_hangindent: {
|
|
\cs_if_exist:NT \@kernel@tag@hangfrom {
|
|
\cs_new_eq:NN \__asmejour_sav@kernel@tag@hangfrom \@kernel@tag@hangfrom
|
|
% modify command in latex-lab-sec
|
|
\cs_gset_protected:Npn \@app@kernel@tag@hangfrom ##1
|
|
{
|
|
\tagstructbegin{tag=\l__tag_para_tag_tl}
|
|
\cs_if_exist_use:N \__tag_gincr_para_begin_int:
|
|
\tagstructbegin{tag=Lbl}
|
|
\setbox\@tempboxa
|
|
\hbox
|
|
{
|
|
\bool_lazy_and:nnT
|
|
{\tag_if_active_p:}
|
|
{\g__tag_mode_lua_bool}
|
|
{\tagmcbegin{tag=Lbl}}
|
|
{##1}
|
|
}
|
|
\tag_suspend:n{hangfrom}
|
|
% \hangindent \wd\@tempboxa\noindent %% <== changing this line only
|
|
\hangindent 0pt\noindent
|
|
\tag_resume:n{hangfrom}
|
|
\tagmcbegin{}\box\@tempboxa\tagmcend\tagstructend\tagmcbegin{}
|
|
}
|
|
\cs_set_eq:NN \@kernel@tag@hangfrom \@app@kernel@tag@hangfrom
|
|
}
|
|
\cs_new_eq:NN \__asmejour_sav@hangfrom \@hangfrom
|
|
\cs_gset_protected:Npn \@app@hangfrom ##1
|
|
{
|
|
\setbox\@tempboxa\hbox{{##1}}%
|
|
% \hangindent \wd\@tempboxa\noindent\box\@tempboxa} %% <== changing this line only
|
|
\hangindent 0pt\noindent\box\@tempboxa
|
|
}
|
|
}
|
|
|
|
\renewcommand{\appendix}{
|
|
\par
|
|
\__asmejour_change_hangindent:
|
|
\setcounter{section}{0}
|
|
\setcounter{subsection}{0}
|
|
\@addtoreset{equation}{section}
|
|
\gdef\theequation{\@Alph\c@section\@arabic\c@equation}
|
|
\gdef\thesection{\@Alph\c@section}
|
|
\gdef\thesubsection{\@Alph\c@section.\@arabic\c@subsection}
|
|
\AddToHook{cmd/section/before}{
|
|
\gdef\@seccntformat##1{\appendixname\ \csname the##1\endcsname :\hspace{0.5em}}
|
|
\def\@hangfrom{\@app@hangfrom}
|
|
\def\@kernel@tag@hangfrom{\@app@kernel@tag@hangfrom}
|
|
}
|
|
\AddToHook{cmd/subsection/before}{ % added to Latex 2020/10/01
|
|
\gdef\@seccntformat##1{\csname the##1\endcsname.\hspace{0.5em}}
|
|
\def\@hangfrom{\__asmejour_sav@hangfrom}
|
|
\def\@kernel@tag@hangfrom{\__asmejour_sav@kernel@tag@hangfrom}
|
|
}
|
|
}
|
|
\ExplSyntaxOff
|
|
|
|
% natbib's \bibsection controls section heading for References.
|
|
% If you wish to customize the title of the reference list put \renewcommand{\refname}{Other Title}
|
|
% into the .tex file, after the preamble (before the other bib commands near the end)
|
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%% List environments %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
% Revised 2025/03/30, removing enumitem
|
|
|
|
\renewcommand\labelenumi{(\theenumi)} % cf. article.cls
|
|
\setlength\leftmargini{2em} % reset here b/c @twocolumn not yet invoked
|
|
|
|
% No extra space between list items (cf. size9.clo)
|
|
\AddToHook{begindocument/end}{
|
|
\AddToHook{cmd/@listi/after}{
|
|
\parsep 0\p@
|
|
\itemsep 0\p@
|
|
}
|
|
}
|
|
|
|
%%%%%%%%%%%%%%%%% Hyperref %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\ifasmejour@pdftex
|
|
%%% to assist with unicode glyph mapping, following M. Sharpe's recommendation in the newtx documentation.
|
|
%%% as of 2024/07/28, these are still necessary with \DocumentMetadata{pdfstandard=A-3u}.
|
|
\InputIfFileExists{glyphtounicode-cmr.tex}{}{} %% additional mappings
|
|
\InputIfFileExists{glyphtounicode-ntx.tex}{}{} %% additional mappings
|
|
\fi
|
|
|
|
%%%
|
|
|
|
\RequirePackage[psdextra]{hyperref} % provide most hyperref options via \hypersetup, but also per documentation
|
|
% set [psdextra] here (for additional math support in bookmarks) 2021/12/23
|
|
\hypersetup{%
|
|
pdfborder={0 0 0},
|
|
bookmarksnumbered=true,
|
|
bookmarksopen=true,
|
|
bookmarksopenlevel=1,
|
|
colorlinks=true,
|
|
linkcolor=blue,
|
|
citecolor=blue,
|
|
urlcolor=blue,
|
|
filecolor=red, % added 2021/12/23, to make certain broken links more apparent
|
|
pdfnewwindow=true,
|
|
pdfpagelayout=SinglePage, % was TwoPageRight, changed 2020/08/12
|
|
pdfdisplaydoctitle=true,
|
|
}
|
|
|
|
\urlstyle{same} % don't switch to typewriter font
|
|
\RequirePackage{doi} % supports nasty characters in some doi's
|
|
\renewcommand{\doitext}{doi:~} % change from default, {doi:}, to this for ASME specification
|
|
|
|
\providecommand*{\toclevel@subfigure}{1}% <== to address unknown bookmark level of subfigure. 2021/12/24
|
|
\providecommand\hrefurl[2]{\href{#1}{#2}}% <== in case no \DocumentMetadata{..}
|
|
|
|
|
|
%%%%%% Adjustments to accommodate hyperref bookmarks %%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
%%% Recent development of \pdfstring has removed all robust commands from bookmarks (2021/12/23).
|
|
%%% By mid-2024, no errors are thrown except for \bm; however, these commands still serve to suppress warnings.
|
|
%%% Math shift by $..$ still creates a warning, but I am leaving that in place. To avoid, use \( .. \) instead.
|
|
|
|
%% Since \bm is useful in headings, this fix will reduce frequency with which
|
|
%% alternate pdfstrings must be given in section command as \section[pdfstring]{texstring}
|
|
\pdfstringdefDisableCommands{%
|
|
\def\bm#1#{\relax}%
|
|
}
|
|
|
|
%% Let's disable \( and \) in pdf bookmarks, 2020/02/28
|
|
\pdfstringdefDisableCommands{%
|
|
\def\({\relax}%
|
|
\def\){\relax}%
|
|
}
|
|
|
|
%% Let's just remove citations from pdf bookmarks
|
|
\pdfstringdefDisableCommands{%
|
|
\def\cite{\@gobble}%
|
|
}
|
|
|
|
%% Ensure that tag color does not follow \eqref into bookmarks, 2020/02/28
|
|
\pdfstringdefDisableCommands{%
|
|
\def\eqref#1{(\ref*{#1})}%
|
|
}
|
|
|
|
%% Let's make sure footnotes in section headings don't break pdf bookmarks.
|
|
%\robustify{\footnote} % the redefined footnote above is protected, 2023/10/21
|
|
\pdfstringdefDisableCommands{%
|
|
\def\footnote#1{}%
|
|
}
|
|
|
|
|
|
%%%%%%%%%%%%% Define some section and other names for special environments %%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\providecommand{\nomname}{Nomenclature}
|
|
\providecommand{\keywordname}{Keywords}
|
|
\providecommand{\CAwords}{Corresponding Author.}
|
|
|
|
|
|
%%%%%%%%%%%%% Nomenclature Environment %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
%% Nomenclature environment in ASME Journal Style.
|
|
%% Run twice to get proper label width.
|
|
%% Set first optional argument (a dimension) to override automatic label width (e.g., if one label too wide)
|
|
%% Second argument can be used to rename the section, e.g., to List of Symbols.
|
|
|
|
\newlength\widest
|
|
\newlength\asmejour@widest
|
|
\newlength\nomenwidth
|
|
\newlength\savitemsep
|
|
|
|
\NewDocumentCommand{\entry}{m m}{%
|
|
\ifblank{#2}{%
|
|
\ClassError{\ClassName}{The command \protect\entry should have two arguments. For subheadings, use \protect\EntryHeading}{It appears that you gave only one argument to \protect\entry. You must include a second argument.}
|
|
}{%
|
|
\item[\hfill#1${} = {}$]#2%
|
|
\@itempenalty=-\@lowpenalty%
|
|
\setlength\itemsep\savitemsep%
|
|
\settowidth\asmejour@widest{#1${} = {}$}%
|
|
\ifdim\asmejour@widest>\widest \global\setlength\widest\asmejour@widest\fi%
|
|
}
|
|
}
|
|
|
|
%% A separate command command for nomenclature subheadings
|
|
\NewDocumentCommand\EntryHeading{m}{%
|
|
\itemsep12\p@ plus 4\p@ minus 4\p@
|
|
\goodbreak\item[\bfseries#1\hfill]\mbox{}\itemsep3\p@ plus 1\p@ minus 1\p@\@itempenalty=1000% add \mbox for tagged pdf, 2023/10/20
|
|
}
|
|
|
|
\newlength\savwidest
|
|
\NewDocumentEnvironment{nomenclature}{O{\nomenwidth} O{\nomname} }{
|
|
\setlength{\widest}{0em}
|
|
\section*{#2}
|
|
\raggedright
|
|
\begin{list}{}{%
|
|
\setlength{\topsep}{0pt}
|
|
\setlength{\partopsep}{0pt}
|
|
\setlength{\itemsep}{0pt}
|
|
\setlength{\parsep}{\itemsep}
|
|
\setlength{\labelsep}{0em}
|
|
\setlength{\labelwidth}{#1}
|
|
\setlength{\leftmargin}{\labelwidth}
|
|
\addtolength{\leftmargin}{\labelsep}
|
|
\setlength\savitemsep\itemsep % EntryHeading changes \itemsep from 0pt
|
|
}%
|
|
}{%
|
|
\immediate\write\@auxout{\global\savwidest=\the\widest}% after the preamble, the aux file will set this value...
|
|
\end{list}\ignorespacesafterend
|
|
}
|
|
\AtBeginDocument{
|
|
\setlength{\nomenwidth}{\savwidest} % ...and this will set nomenwidth to the saved widest label width
|
|
}
|
|
|
|
|
|
%%%%%%%%%%%%%%%% List of figures and list of tables %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
%% ASME requires these lists for production.
|
|
\ifasmejour@nolists
|
|
\ClassNoteNoLine{\ClassName}{Omitting lists of figures and tables}%
|
|
\else
|
|
\AtEndDocument{%
|
|
\twocolumn[%
|
|
\listoffigures
|
|
\listoftables
|
|
]%
|
|
}%
|
|
\fi
|
|
|
|
|
|
%%%%%%%%%%%%%%%% Author/Title/Abstract block %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
% convert to expl3 2024/08/19
|
|
\ExplSyntaxOn
|
|
|
|
\coffin_new:N \g__asmejour_authorblock_coffin
|
|
\coffin_new:N \g__asmejour_ruleblock_coffin
|
|
\coffin_new:N \g__asmejour_abstract_coffin
|
|
\coffin_new:N \g__asmejour_title_coffin
|
|
\coffin_new:N \g__asmejour_firstrowauthorblock_coffin
|
|
|
|
\dim_new:N \g__asmejour_coffinsep_dim %%% vert space between aut coffins
|
|
\dim_gset:Nn \g__asmejour_coffinsep_dim {4.5mm}
|
|
|
|
\dim_new:N \g__asmejour_coffinspace_dim %%% vert space between title/abst coffins
|
|
\dim_gset:Nn \g__asmejour_coffinspace_dim {6.75mm}
|
|
|
|
\dim_new:N \g__asmejour_rulecofheight_dim
|
|
\dim_new:N \g__asmejour_titleheight_dim
|
|
|
|
\cs_new:Nn \__asmejour_internallinenumbers:n
|
|
{
|
|
\ifasmejour@lineno
|
|
\str_if_in:nnT {#1} {R} { \rightlinenumbers* }
|
|
\str_if_in:nnT {#1} {r} { \rightlinenumbers* }
|
|
\cs_set:Npn \thelinenumber { \@roman\c@linenumber }
|
|
\internallinenumbers
|
|
\fi
|
|
}
|
|
|
|
%% In case tagging is not loaded, 2025/04/06
|
|
\cs_if_exist:NF \tag_struct_begin:n
|
|
{
|
|
\cs_new:Npn \tag_struct_begin:n #1 { \scan_stop: }
|
|
\cs_new:Nn \tag_struct_end: { \scan_stop: }
|
|
}
|
|
|
|
%% This command is used in the .tex file
|
|
\NewDocumentCommand\SetAuthorBlock{m m}{
|
|
\__asmejour_setauthorblock:nn { #1 } { #2 }
|
|
}
|
|
\int_gzero_new:N \g__asmejour_authorno_int
|
|
\seq_new:N \g__asmejour_author_seq
|
|
\msg_new:nnn { \ClassName } { missingauthor } { Missing~author~name,~check~\SetAuthorBlock~command[s]! }
|
|
|
|
|
|
%% Attach each successive authorblock to the list, which is saved in \g__asmejour_firstrowauthorblock_coffin
|
|
\cs_if_exist:NF \str_set:Ne { \cs_generate_variant:Nn \str_set:Nn {Ne} }
|
|
|
|
\cs_new:Nn \__asmejour_setauthorblock:nn {
|
|
\int_gincr:N \g__asmejour_authorno_int
|
|
\tl_if_empty:nT {#1} {
|
|
\msg_warning:nn { \ClassName } { missingauthor }
|
|
}
|
|
\seq_gput_right:Nn \g__asmejour_author_seq {#1}
|
|
\str_set:Ne \ltmpa_str { Author~\int_use:N \g__asmejour_authorno_int }
|
|
\tag_struct_begin:n{tag=Div, title-o={ \ltmpa_str } }
|
|
\vcoffin_gset:Nnn \g__asmejour_authorblock_coffin {48.2mm}
|
|
{
|
|
\__asmejour_internallinenumbers:n {}
|
|
\raggedleft\sffamily
|
|
{\Condhuge\CondSansBold \tl_trim_spaces:n { #1 } }\\
|
|
\CondSans#2
|
|
}
|
|
\tag_struct_end:
|
|
\int_compare:nNnTF { \g__asmejour_authorno_int } = { 1 }
|
|
{
|
|
\coffin_gjoin:NnnNnnnn \g__asmejour_firstrowauthorblock_coffin { hc } { b } \g__asmejour_authorblock_coffin { hc } {t } { 0pt } { 0pt }
|
|
\dim_gset:Nn \g__asmejour_rulecofheight_dim { \coffin_ht:N \g__asmejour_firstrowauthorblock_coffin + \coffin_dp:N \g__asmejour_firstrowauthorblock_coffin }
|
|
}{
|
|
\coffin_gjoin:NnnNnnnn \g__asmejour_firstrowauthorblock_coffin { hc } { b } \g__asmejour_authorblock_coffin {hc } {t } { 0pt } { - \dim_use:N \g__asmejour_coffinsep_dim }
|
|
\dim_gset:Nn \g__asmejour_rulecofheight_dim { \coffin_ht:N \g__asmejour_firstrowauthorblock_coffin + \coffin_dp:N \g__asmejour_firstrowauthorblock_coffin }
|
|
}
|
|
}
|
|
%% Standard coffin poles are (l hc r t T vc b B). See xcoffins documentation.
|
|
|
|
% build comma-separated list of author names
|
|
\cs_if_exist:NF \tl_set:Ne { \cs_generate_variant:Nn \tl_set:Nn {Ne} }
|
|
\cs_if_exist:NF \seq_item:NV { \cs_generate_variant:Nn \seq_item:Nn {NV} }
|
|
\tl_new:N \g_asmejour_authors_tl
|
|
\tl_gset:Nn \g_asmejour_authors_tl \c_empty_tl
|
|
\cs_new_protected:Nn \__asmejour_concataut: {
|
|
\int_set:Nn \l_tmpa_int {1}
|
|
\tl_clear:N \l_tmpb_tl
|
|
\int_do_until:nNnn { \l_tmpa_int } > { \g__asmejour_authorno_int }
|
|
{
|
|
\tl_set:Ne \l_tmpb_tl { \seq_item:NV \g__asmejour_author_seq \l_tmpa_int }
|
|
\regex_replace_all:nnN { \cA\~ } {\ } \l_tmpb_tl % replace ~ by space in author list
|
|
\tl_replace_all:Nnn \l_tmpb_tl { \affil } { \use_none:n }% include in case of carry-over from asmeconf
|
|
\tl_remove_all:Nn \l_tmpb_tl { \JointFirstAuthor } % include in case of carry-over from asmeconf
|
|
\tl_remove_all:Nn \l_tmpb_tl { \CorrespondingAuthor } % takes no argument in asmejour, unlike asmeconf
|
|
\int_compare:nNnT { \l_tmpa_int } < { \g__asmejour_authorno_int } {
|
|
\tl_put_right:Nn \l_tmpb_tl { ,~ }
|
|
}
|
|
\tl_gput_right:NV \g_asmejour_authors_tl \l_tmpb_tl
|
|
\int_incr:N \l_tmpa_int
|
|
}
|
|
%\iow_term:e { Authors:~ \tl_use:N \g_asmejour_authors_tl } % diagnostic only
|
|
}
|
|
|
|
\cs_new:Nn \__asmejour_settitle:n
|
|
{
|
|
\cs_gset:Npn \@title {#1} % 2024/07/30 (make this standard command available)
|
|
\tag_struct_begin:n{tag=Title, title=Title}
|
|
\vcoffin_gset:Nnn \g__asmejour_title_coffin {114mm}
|
|
{
|
|
\__asmejour_internallinenumbers:n {R}
|
|
\vskip 0.5mm % <== ASME doesn't align bar and text
|
|
\noindent\CondHuge\CondSansBold\raggedright
|
|
#1
|
|
\par
|
|
}
|
|
\tag_struct_end:
|
|
}
|
|
|
|
%% \keywords command is used in the .tex file
|
|
\cs_new:Npn \__asmejour_keywords {\relax}
|
|
\NewDocumentCommand{\keywords}{m}{% removed g option, 2021/01/30
|
|
\cs_gset:Npn \__asmejour_keywords { \par\vskip\baselineskip\noindent{\keywordname :}~#1 }
|
|
}
|
|
|
|
\cs_new:Nn \__asmejour_setabstract:n
|
|
{
|
|
\tag_struct_begin:n{tag=Div, title=Abstract}
|
|
\vcoffin_gset:Nnn \g__asmejour_abstract_coffin {114mm}
|
|
{
|
|
\__asmejour_internallinenumbers:n {R}
|
|
\noindent\itshape
|
|
#1
|
|
\__asmejour_keywords\par
|
|
\vskip 4mm % <== at bottom of abstract to extend rule
|
|
}
|
|
\tag_struct_end:
|
|
}
|
|
|
|
%% Now assemble and typeset the author, title, and abstract coffins
|
|
\cs_new:Nn \__asmejour_constructauthorblock: {
|
|
\coffin_gjoin:NnnNnnnn \g__asmejour_title_coffin { l } { b } \g__asmejour_abstract_coffin { l } {t } { 0pt } { - \dim_use:N \g__asmejour_coffinspace_dim }
|
|
\dim_gset:Nn \g__asmejour_titleheight_dim { \coffin_ht:N \g__asmejour_title_coffin + \coffin_dp:N \g__asmejour_title_coffin }
|
|
\if_dim:w \g__asmejour_titleheight_dim > \g__asmejour_rulecofheight_dim
|
|
\dim_gset:Nn \g__asmejour_rulecofheight_dim { \g__asmejour_titleheight_dim }
|
|
\else:
|
|
\dim_add:Nn \g__asmejour_rulecofheight_dim {7.0mm}
|
|
\fi:
|
|
\hcoffin_gset:Nn \g__asmejour_ruleblock_coffin { \color{\asmejour@barcolor}\rule{2.1mm}{ \dim_use:N \g__asmejour_rulecofheight_dim } }
|
|
\coffin_gjoin:NnnNnnnn \g__asmejour_firstrowauthorblock_coffin { vc } { r } \g__asmejour_ruleblock_coffin {vc } { l } { \dim_use:N \g__asmejour_coffinsep_dim } { 0pt }
|
|
\coffin_gjoin:NnnNnnnn \g__asmejour_firstrowauthorblock_coffin { vc } { r } \g__asmejour_title_coffin {vc } { l } { \dim_use:N \g__asmejour_coffinsep_dim } { 0pt }
|
|
\coffin_typeset:Nnnnn \g__asmejour_firstrowauthorblock_coffin { l }{t }{ 0pt }{ 0pt }
|
|
\__asmejour_concataut:
|
|
\cs_gset:Npn \@author { \tl_use:N \g_asmeconf_authors_tl }
|
|
}
|
|
|
|
\ExplSyntaxOff
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
%% Corresponding author gets footnote #1 and subsequent notes are 2, 3, ....
|
|
%% ASME apparently does not recognize joint first authors...so I have not coded that functionality
|
|
|
|
%% Flag for corresponding author (only one expected, although this code supports more than one)
|
|
\newif\ifasmejour@CA
|
|
|
|
%% ASME prefers email to be in address block, not CA footnote; removed option 2021/01/30
|
|
\NewDocumentCommand{\CorrespondingAuthor}{}{%
|
|
\global\asmejour@CAtrue%
|
|
\def\@makefnmark{\hbox{\@textsuperscript{\sffamily\@thefnmark}}}%
|
|
\footnotemark%
|
|
\addtocounter{footnote}{-1}% in case of more than one CA
|
|
}
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% make the title block
|
|
|
|
\ExplSyntaxOn
|
|
|
|
%% space between title block an start of two-column text
|
|
\skip_new:N \g__asmejour_AbstractSep_skip
|
|
\skip_gset:Nn \g__asmejour_AbstractSep_skip {12.5mm plus 2mm minus 2mm }
|
|
|
|
\NewDocumentCommand\AbstractSep{m}{
|
|
\skip_gset:Nn \g__asmejour_AbstractSep_skip {#1}
|
|
}
|
|
|
|
\cs_new:Npn \__asmejour_maketitle:
|
|
{
|
|
\thispagestyle{title}%
|
|
\ifasmejour@singlecolumn % added 2024/07/20
|
|
\__asmejour_constructauthorblock:
|
|
\vskip \g__asmejour_AbstractSep_skip
|
|
\else
|
|
\twocolumn[
|
|
\__asmejour_constructauthorblock:
|
|
\vskip \g__asmejour_AbstractSep_skip
|
|
]
|
|
\fi
|
|
\ifasmejour@CA
|
|
\addtocounter{footnote}{1}
|
|
\footnotetext{\CAwords}
|
|
\fi
|
|
\DateFootnote
|
|
\ifasmejour@contractor\revfootnote{The~United~States~Government~retains,~and~by~accepting~the~article~for~publication,~the~publisher~acknowledges~that~the~United~States~Government~retains,~a~non-exclusive,~paid-up,~irrevocable,~worldwide~license~to~publish~or~reproduce~the~published~form~of~this~work,~or~allow~others~to~do~so,~for~United~States~Government~purposes.}%
|
|
\fi
|
|
\ifasmejour@govt\revfootnote{This~material~is~declared~a~work~of~the~U.~S.~Government~and~is~not~subject~to~copyright~protection~in~the~United~States.~Approved~for~public~release;~distribution~is~unlimited.}%
|
|
\fi
|
|
\ifasmejour@govtsome\revfootnote{This~work~was~authored~in~part~by~a~U.~S.~Government~employee~in~the~scope~of~his/her~employment.~ASME~disclaims~all~interest~in~the~U.~S.~Government's~contribution.}%
|
|
\fi
|
|
}
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
%% Redefine titling commands from standard LaTeX article class
|
|
|
|
\RenewDocumentCommand{\maketitle}{}{\__asmejour_maketitle:}
|
|
\RenewDocumentCommand{\title}{m}{ \__asmejour_settitle:n {#1} }
|
|
\RenewDocumentCommand{\author}{m}{
|
|
\msg_error:nn { \ClassName }{ authornotused }
|
|
}
|
|
\msg_new:nnnn { \ClassName } { authornotused }{ In~the~asmejour~class,\\ the~\author~command~is~not~used.\\ Use~\SetAuthorBlock{Name}{Address}~for~each~author~instead. } { The~\author~command~is~not~defined~in~the~asmejour~class.~Use~\SetAuthorBlock{Name}{Address}~as~described~in~the~documentation. }
|
|
|
|
\RenewDocumentEnvironment{abstract}{+b}{\gdef\tmp{ \__asmejour_setabstract:n {#1} }\aftergroup\tmp}{\ignorespacesafterend}
|
|
%% Thanks to David Carlisle for the suggestion of \gdef\tmp{...
|
|
|
|
%% Put date as an unnumbered footnote at bottom of first column
|
|
%% If \date command is not used, default to \DateFootnote
|
|
\bool_new:N \g__asmejour_date_bool
|
|
\bool_gset_true:N \g__asmejour_date_bool
|
|
\tl_new:N \g__asmejour_date_tl
|
|
\tl_gset:Nn \g__asmejour_date_tl { \today }
|
|
\tl_new:N \DateFootnote
|
|
\tl_gset:Nn \DateFootnote {
|
|
\if_bool:N \g__asmejour_date_bool \revfootnote{\g__asmejour_date_tl} \else: \fi:
|
|
}
|
|
\RenewDocumentCommand{\date}{m}
|
|
{
|
|
\tl_if_empty:nTF {#1}
|
|
{ \bool_gset_false:N \g__asmejour_date_bool }
|
|
{ \tl_gset:Nn \g__asmejour_date_tl { #1 } }
|
|
}
|
|
|
|
\RenewDocumentCommand{\thanks}{m}{\relax}%% disabling this standard command, as it is inconsistent with this format
|
|
\ExplSyntaxOff
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
\endinput
|
|
%%
|
|
%% End of file `asmejour.cls'.
|
|
|