From 85b84a6b179987d975ac7e840cf1a71458cbe338 Mon Sep 17 00:00:00 2001 From: Thomas Dehaeze Date: Thu, 27 Nov 2025 17:53:03 +0100 Subject: [PATCH] Use correct class --- paper/asmeconf.cls | 2587 -------------------------- paper/{asmeconf.bst => asmejour.bst} | 1063 ++++++----- paper/asmejour.cls | 1498 +++++++++++++++ 3 files changed, 2105 insertions(+), 3043 deletions(-) delete mode 100644 paper/asmeconf.cls rename paper/{asmeconf.bst => asmejour.bst} (62%) create mode 100644 paper/asmejour.cls diff --git a/paper/asmeconf.cls b/paper/asmeconf.cls deleted file mode 100644 index e0f8eef..0000000 --- a/paper/asmeconf.cls +++ /dev/null @@ -1,2587 +0,0 @@ -% !TEX encoding = UTF-8 Unicode -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% -%% This file provides the asmeconf LaTeX class for formatting conference papers according to -%% ASME conference requirements as represented on ASME's conference web pages in 2025. -%% -%% This file's version and date: - \def\versionno{1.45} - \def\versiondate{2025/11/10\space} -%% -%% Author: John H. Lienhard, V -%% Department of Mechanical Engineering -%% Massachusetts Institute of Technology -%% Cambridge, MA 02139-4307 USA -%% -%% This LaTeX template was designed to approach the following aims: -%% -%% 1. Match ASME's current layout and font specifications -%% 2. With asmeconf.bst, match ASME's reference formats including DOI & URL (replaces asmems4.bst) -%% 3. Provide hyperref compatibility for hyperlinks, pdf bookmarks, and metadata -%% 4. Set author names in either the traditional grid or the more recent inline style -%% 5. Support citations, footnotes, and bold face, sans serif math in section headings -%% 6. Provide line numbers for editing and review -%% 7. Support balancing length of columns on last page -%% 8. Provide copyright footer for federal employees and contractors -%% 9. Support archival PDF/A standards -%% 10. Enable various math features from the newtx or unicode-math/fontspec packages -%% 11. Support inclusion of passages in languages other than English -%% -%% This class is compatible with either pdfLaTeX or LuaLaTeX. Fontspec and unicode-math will load automatically -%% with LuaLaTeX. To use LuaLaTeX without fontspec and unicode-math, call the [nofontspec] option. -%% -%% Use an up-to-date LaTeX distribution: for pdfLaTeX, TeX Live 2020 or later; for LuaLaTeX, TeX Live 2021 or later. -%% A complete LaTeX installation is also recommended: asmeconf loads ~25 packages in addition to the LaTeX format. -%% All packages required by the class are in TeX Live and CTAN (https://ctan.org/). -%% -%% Commands for entering conference headers and author names are specific to this class. -%% See asmeconf-template.tex for details. -%% -%% The class defines abstract (with keywords), abstract* (no keywords), and nomenclature environments. -%% The latter has an optional argument to control the space between the entries and the definitions. -%% -% ========================================================= -%% -%% 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{asmeconf}[\versiondate ASME Conference Paper LaTeX Template (JHL)] - -\LoadClass[twoside,10pt]{article}% twocolumn is initiated in \MakeTitle -% Even/odd page layout is not used in ASME's specs, although the papers are printed in two-sided format. - -\RequirePackage{etoolbox}% using \patchcmd in section, nocasechange, & lineno code and \pretocmd in appendix code - -\newif\ifpdftex % redeclaration by other packages will be ignored -\newif\ifPDFtex % *deprecated* user macro -\ExplSyntaxOn - \str_const:Nn \ClassName {asmeconf} - \prop_put:Nnn \g_msg_module_type_prop { \ClassName } { Class } - \sys_if_engine_pdftex:T - { - \pdftextrue - \PDFtextrue - \msg_new:nnn { \ClassName } { notagpdftex } { Run~lualatex,~not~pdftex,\iow_newline: - when~tagging~is~used~in~\DocumentMetadata } - \cs_if_exist:NT \tag_if_active:T % not in TeX Live 2021 - { - \tag_if_active:T { \msg_error:nn { \ClassName } { notagpdftex } } - } - } -\ExplSyntaxOff - - -%%%%%%%%%%%%% Compatibility codes for older distributions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -% these will be dropped as time goes by ... - -\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{2022/06/01}{\relax}{% - \ClassError{\ClassName}{Your LaTeX format is dated \fmtversion. Formats dated 2022-06-01 or later are very strongly recommended for the asmeconf class. Older formats and packages may generate errors or fail entirely!!}{UPDATE your LaTeX distribution. TeX Live is available for download at no charge: \string https://www.tug.org/texlive/. You can try to click past the errors for now...}% -} - -% If latex release is pre 2022/06, need to load textcase package -\ifx\AddToNoCaseChangeList\@undefined % updated 2022/07/03, see https://github.com/John02139/asmeconf/issues/5 - \RequirePackage{textcase} %% Allows uppercase titles and captions without errors from math and citations - \typeout{asmeconf is loading textcase package.} -\else - \let\MakeTextUppercase\MakeUppercase% keep using \MakeTextUppercase for backward compatibility -\fi - -% Allow pre 2021/11/15 formats to see the graphicx alt key without causing an error -\IfFormatAtLeastTF{2021/11/15}{ - \relax % keep the T option for backward compatibility -}{ - \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}% need at least 2018/04, but other things also break at that age. -\fi - -% fnpos is loaded if footmisc package is older than 2022/02/05 -% kvoptions is loaded if latex is older than 2022/11/01 - - -%%% fallbacks for tagging commands, in case tagpdf is not loaded - -\ExplSyntaxOn -%% In case tagging is not loaded, edited 2025/11/07. -\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: } - } -\cs_if_exist:NF \tag_mc_begin:n - { - \cs_new:Npn \tag_mc_begin:n #1 { \scan_stop: } - \cs_new:Nn \tag_mc_end: { \scan_stop: } - } -\cs_if_exist:NF \tagpdfsetup - { - \cs_new:Npn \tagpdfsetup #1 { \scan_stop: } - } -\cs_if_exist:NF \tagpdfparaOff - { - \cs_new:Npn \tagpdfparaOff { \scan_stop: } - \cs_new:Npn \tagpdfparaOn { \scan_stop: } - } -\ExplSyntaxOff - -%%%%%%%%%%%%% Options for the class %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%% Some helper code first - -%% Related to loading other alphabets for Cyrillic, Greek, Japanese, and Vietnamese text -\newif\ifac@cyrillic -\newif\ifac@greek -\newif\ifac@japanese -\newif\ifac@vietnamese -\newif\ifac@mainset - -\providecommand\ac@TtwoA{} -\providecommand\ac@LGR{} -\providecommand\ac@Tfive{} - -\ExplSyntaxOn -\str_new:N \g__asmeconf_main_str -\str_gset:Nn \g__asmeconf_main_str {english} - -\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 } -\msg_new:nnnn { \ClassName } { nogreekmain } - { To~set~Greek~as~the~main~language,~you~should~use~luaLaTeX~not~pdfTeX.~ - You~will~need~the~NotoSerif~and~NotoSans~fonts } - { Under~pdfTeX,~asmeconf~is~not~compatible~with~Greek~as~the~main~font,~as~you~will~see. } - -%% Test whether main language is from a group that use the Cyrillic alphabet -\cs_new:Nn \__asmeconf_findcyr:n - { - \seq_set_split:Nnn \l_tmpa_seq { ; } { #1 } - \seq_map_function:NN \l_tmpa_seq \__asmeconf_flagcyr:n - } -\cs_new:Nn \__asmeconf_flagcyr:n - { - \str_if_eq:VnT \g__asmeconf_main_str {#1} { - \gdef\ac@TtwoA{T2A} - \ac@cyrillictrue - } - } -%% Set main language -\cs_new:Nn \__asmeconf_setupmain:n {% revised 2025/03/24 - \str_gset:Nn \g__asmeconf_main_str {#1}% - \PassOptionsToPackage{ main=\g__asmeconf_main_str }{babel} - \ac@mainsettrue - \str_if_eq:nnF {english} {#1} - { - \str_if_eq:nnTF {vietnamese} {#1} { - \PassOptionsToPackage{vietnamese.noencoding}{babel}% suppress unneeded warning about encoding - %\RequirePackage[vietnamese=nohyphenation]{hyphsubst}% eliminates a warning, but not needed with recent versions of babel - \ac@vietnamesetrue - \gdef\ac@Tfive{T5} - }{ - \str_if_eq:nnTF {greek} {#1} { - \ifpdftex - \msg_error:nn { \ClassName } { nogreekmain } - \else - \ac@greektrue - \gdef\ac@TLGR{LGR} - \fi - }{ - \__asmeconf_findcyr:n{russian;belarusian;bulgarian;macedonian;serbianc;ukrainian} - } - } - } - \msg_note:nnn { \ClassName } { mainlang } {#1} -} - -\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}{ - \DeclareKeys[\ClassName] - { - balance .if = asmeconf@balance ,% Option to balance column height on last page [balance] - balance .usage = load , - colorlinks .code = \PassOptionsToPackage{colorlinks}{hyperref} ,% Option to have colored hyperlinks, rather than black [colorlinks] - colorlinks .usage = load , - contractor .if = asmeconf@contractor ,% Option for government contractor copyright notice [contractor] - contractor .usage = load , - govt .if = asmeconf@govt ,% Option for copyright notice if all authors are government employees [govt] - govt .usage = load , - govtsome .if = asmeconf@govtsome ,% Option for copyright notice if some (not all) authors are government employees [govtsome] - govtsome .usage = load , - grid .if = asmeconf@grid ,% Option to convert inline author data to a grid of authors [grid] - grid .usage = load , - lineno .if = asmeconf@lineno ,% Option to obtain line numbers [lineno] - lineno .usage = load , - loadscripts .if = asmeconf@loadscripts ,% Option to load support for 19 languages in non-Latin scripts [loadscripts] - loadscripts .usage = load , - main .store = \g__asmeconf_main_str ,% set main language (for babel) - main .usage = preamble , - main .code = \__asmeconf_setupmain:n { #1 }, - mathalfa .code = \msg_warning:nn { \ClassName } { mathalfa },% Warn about old [mathalfa= ] keyvalue; an imperfect fix. 2025/04/07 - mathalfa .usage = load , - nofontspec .if = asmeconf@nofontspec ,% Option NOT to use fontspec package under luaLaTeX [nofontspec] - nofontspec .usage = load , - nofoot .if = asmeconf@nofoot ,% Option to omit the footer [nofoot] - nofoot .usage = load , - nohead .if = asmeconf@nohead ,% Option to omit the conference headers [nohead] - nohead .usage = load , - unboldcaption .if = asmeconf@unboldcaption ,% Option for caption text not to use boldface type [unboldcaption] - unboldcaption .usage = load, - } - \DeclareUnknownKeyHandler[\ClassName]{\relax}% suppress warning about unused keys - \ProcessKeyOptions -}{% And more compatibility code for distributions pre-2022/11 - \RequirePackage{kvoptions} - \SetupKeyvalOptions{ - family=\ClassName, - prefix=asmeconf@, - setkeys=\kvsetkeys, - } - - %%% set key [colorlinks] to have colored hyperlinks, rather than black links (use a key with new pdfmanagement, 2021/12/01) - \define@key{\ClassName}{colorlinks}[colorlinks]{% - \PassOptionsToPackage{#1}{hyperref}% - } - %% Option for caption text not to use boldface type [unboldcaption] - \DeclareBoolOption{unboldcaption} - %% Option to obtain line numbers [lineno] - \DeclareBoolOption{lineno} - %% Option to balance column height on last page [balance] - \DeclareBoolOption{balance} - %% Option to convert inline author data to a grid of authors [grid] - \DeclareBoolOption{grid}% - %% Option to omit the footer [nofoot] - \DeclareBoolOption{nofoot} - %% Option to omit the conference headers [nohead] - \DeclareBoolOption{nohead} - %% 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 for government contractor copyright notice [contractor] - \DeclareBoolOption{contractor} - %% Option NOT to use fontspec package under luaLaTeX [nofontspec] - \DeclareBoolOption{nofontspec} - %% Option to load support for 19 languages in non-Latin scripts [loadscripts] - \DeclareBoolOption{loadscripts} - %% Key to set main language - \define@key{\ClassName}{main}{% remove default 2024/07/26, to avoid conflict with subsequent logic - \PassOptionsToPackage{main=#1,#1}{babel}% Adding #1 resolves conflict of russianb.ldf & ukrainianb.ldf under "main=". - % If only reality were this simple... - \ac@mainsettrue - \__asmeconf_setupmain:n { #1 } - } - %% the key [mathalfa= ] was dropped with v1.41; instead, load the mathalpha package in your preamble - \define@key{\ClassName}{mathalfa}{% - \msg_note:nn { \ClassName } { mathalfa } - } - - \DeclareDefaultOption{}% suppress warnings about unused options - \ProcessKeyvalOptions{\ClassName} - - - %% Turn off these keys now that we're done with them - \def\ac@KeyFamily{\ClassName} - \cs_new:Nn \__asmeconf_disablekeys:n - { - \seq_set_split:Nnn \l_tmpa_seq { ; } { #1 } - \seq_map_function:NN \l_tmpa_seq \__asmeconf_disableoptions:n - } - \cs_new:Nn \__asmeconf_disableoptions:n - { - \DisableKeyvalOption[% - action=ignore,% - class=\ClassName% - ]{#1}{\ac@KeyFamily}% - } - \__asmeconf_disablekeys:n - { colorlinks;unboldcaption;lineno;balance;grid;nofoot;nohead;govt;govtsome; - contractor;mathalfa;nofontspec;loadscripts;main - } -} - -%% if main language was not chosen explicitly, ensure default to English -\ifac@mainset\else - \PassOptionsToPackage{main=USenglish}{babel} - \ClassWarning{\ClassName}{Selecting~US~English~as~babel's~primary~language,~since~main=~not~set}% -\fi - -\ExplSyntaxOff - -%% The expl3 code required for [grid] was not def'd until the June 2021 release -\IfFormatAtLeastTF{2021/06/01}{\relax}{% - \ifasmeconf@grid - \ClassWarning{\ClassName}{Your LaTeX format is dated \fmtversion. Formats dated 2021-06-01 or later are required for the [grid] option. It will be ignored.} - \fi - \asmeconf@gridfalse -} - -%%%%%%%%% Various font-related options %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%% switches for fontspec, from [nofontspec] option -\newif\ifac@fontspec -\newif\ifFontspecLoaded % so user can test in .tex file; CamelCased 2025/04/12 -\newif\ifScriptsLoaded % so user can test in .tex file - -\ifpdftex - \ifasmeconf@nofontspec - \ClassWarningNoLine{\ClassName}{The [nofontspec] option requires LuaLaTeX. It will be ignored under pdfLaTeX}% - \fi - % at this point: ac@pdftex is true, ac@fontspec is false, and asmeconf@nofontspec is true. - \ifasmeconf@loadscripts - \ClassWarningNoLine{\ClassName}{The [loadscripts] option requires LuaLaTeX. It will be ignored under pdfLaTeX}% - \fi - \asmeconf@loadscriptsfalse -\else - \ifasmeconf@nofontspec - \ClassWarningNoLine{\ClassName}{The [nofontspec] option has been issued. LuaLaTeX will run without fontspec and unicode-math}% - \ifasmeconf@loadscripts - \ClassWarningNoLine{\ClassName}{The [loadscripts] option requires fontspec. It will be ignored with the [nofontspec] option}% - \fi - \asmeconf@loadscriptsfalse - \else - \IfFormatAtLeastTF{2020/10/01}{% - \ac@fontspectrue - \FontspecLoadedtrue - \ifasmeconf@loadscripts\ScriptsLoadedtrue\fi - }{% - \ClassError{\ClassName}{Your LaTeX format is dated \fmtversion. LaTeX installations dated 2020-10-01 or later are needed to run LuaLaTeX with the fontspec package. Fontspec will NOT be loaded. Language support will be minimal}{Please UPDATE your LaTeX distribution to obtain best results. TeX Live is available for download at no charge: \string https://www.tug.org/texlive/. You may alternatively choose the [nofontspec] option.}% - } - \fi -\fi -% asmeconf@nofontspec is not used from this point forward. - - -%% dropped class option [largesc] and made it the default (pdftex only). 2025/03/16 -\ifpdftex - \PassOptionsToPackage{largesc=true}{newtxtext}% largesc is a boolean key in newtxtext -\fi - -%% 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}{% - \ifac@fontspec - \def\UpInt{+ss08}% upright integrals in STIX Two Math font and Lete Sans Math fonts - \else - \PassOptionsToPackage{upint}{newtxmath}% this option exists in newtxmath - \fi -} - -%% option to hyphenate the inconsolata typewriter font [hyphenate] and to issue a warning when that's done. -\DeclareOption{hyphenate}{% - \ifac@fontspec - \ClassWarningNoLine{\ClassName}{hyphenate option is not supported by fontspec. It will be ignored}% - \else - \PassOptionsToPackage{hyphenate}{inconsolata}% hyphenate is a key via xkeyval in inconsolata - \ClassNoteNoLine{\ClassName}{Allowing hyphenation of typewriter font}% - \fi -} -%% option for monospacing in inconsolata typewriter font [mono]. (Does not work with Inconsolata-Bold) -\def\MonoNotMono{WordSpace={1,1,1}}% rescaled tt font to match pdf, 2024/07/28 -\DeclareOption{mono}{% - \ifac@fontspec - \def\MonoNotMono{WordSpace={1,0,0},PunctuationSpace={3}}% NB: these are the default WordSpace values - \else - \PassOptionsToPackage{mono}{inconsolata}% mono is a key via xkeyval in inconsolata - \fi -} -%% option for unslashed zero in inconsolata typewriter font [var0]. -\def\ssztwo{}% for Inconsolatazi4; default uses slashed zero, +ss02 uses regular zero -\DeclareOption{var0}{% - \ifac@fontspec - \def\ssztwo{+ss02}% stylistic alternate for regular zero - \else - \PassOptionsToPackage{var0}{inconsolata}% var0 is a key via xkeyval in inconsolata - \fi -} - - -%%%%%%%%%%%%% More Language options %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\newif\ifJapaneseLoaded % user-level switch - -\DeclareOption{japanese}{% to control loading of fontspec options and luatxja-fontspec - \ifac@fontspec - \PassOptionsToPackage{japanese}{babel}% - \ac@japanesetrue - \JapaneseLoadedtrue - \else - \ClassWarningNoLine{\ClassName}{[japanese] option is supported only under LuaLaTeX with fontspec. It will be ignored}% - \fi -} - -\DeclareOption{greek}{% - \PassOptionsToPackage{greek}{babel}% - \ac@greektrue - \gdef\ac@LGR{LGR} -} - -\DeclareOption{vietnamese}{% - \PassOptionsToPackage{vietnamese,vietnamese.noencoding}{babel}% noencoding suppresses unnecessary warning about inputenc - %\RequirePackage[vietnamese=nohyphenation]{hyphsubst} % Eliminates babel warning; not needed with recent versions of babel - \ac@vietnamesetrue - \gdef\ac@Tfive{T5} -} - -\ExplSyntaxOn - -%% Cyrillic languages -\cs_new:Nn \__asmeconf_cyroptions:n - { - \seq_set_split:Nnn \l_tmpa_seq { ; } { #1 } - \seq_map_function:NN \l_tmpa_seq \__asmeconf_cyroptset:n - } -\cs_new:Nn \__asmeconf_cyroptset:n - { - \DeclareOption{#1}{% - \PassOptionsToPackage{#1}{babel}% - \gdef\ac@TtwoA{T2A} - \ac@cyrillictrue - } - } -\__asmeconf_cyroptions:n {russian;belarusian;bulgarian;macedonian;serbianc;ukrainian} - -\ExplSyntaxOff - -% Several languages do not have .ldf files to load. Babel will call these on demand. -% -\DeclareOption{arabic}{\ClassError{\ClassName}{Do not specify "arabic" as a class option}{Instead, give the option [bidi=basic] and specify "arabic" when you call the language within your document.}} -% -\DeclareOption{bengali}{\ClassError{\ClassName}{Do not specify "bengali" as a class option}{Instead, specify "bengali" when you call the language within your document. No class option is needed.}} -% -\DeclareOption{chinese-simplified}{\ClassError{\ClassName}{Do not specify "chinese-simplified" as class option}{Instead, specify "chinese-simplified" when you call the language within your document. No class option is needed.}} -% -\DeclareOption{chinese-traditional}{\ClassError{\ClassName}{Do not specify "chinese-traditional" as class option}{Instead, specify "chinese-traditional" when you call the language within your document. No class option is needed.}} -% -\DeclareOption{chinese}{\ClassError{\ClassName}{Do not specify "chinese" as a class option}{Instead, specify either "chinese-simplified" or "chinese-traditional" when you call the language within your document. No class option is needed.}} -% -\DeclareOption{hindi}{\ClassError{\ClassName}{Do not specify "hindi" as a class option}{Instead, specify "hindi" when you call the language within your document. No class option is needed.}} -% -\DeclareOption{korean}{\ClassError{\ClassName}{Do not specify "korean" as class option}{Instead, specify "korean"when you call the language within your document. No class option is needed.}} -% -\DeclareOption{marathi}{\ClassError{\ClassName}{Do not specify "marathi" as a class option}{Instead, specify "marathi" when you call the language within your document. No class option is needed.}} -% -\DeclareOption{tamil}{\ClassError{\ClassName}{Do not specify "tamil" as a class option}{Instead, specify "tamil" when you call the language within your document. No class option is needed.}} - -%% Suppress warnings about unused global options -\DeclareOption*{} - -\ProcessOptions \relax %% end of options section - - -%%%%%%%%%%%%% Geometry, graphics, colors, bibliography %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\RequirePackage[letterpaper, left=0.5in, right=0.5in, top=0.5in, bottom = 1.in, footskip=0.5in, columnsep=0.38in]{geometry} -% conforms to ASME required margins -\setlength\parindent{0.25in} - -\RequirePackage{graphicx} % removed obsolete options, 2023/11/19 -\RequirePackage[dvipsnames,svgnames,x11names]{xcolor} - -\RequirePackage[sort&compress,numbers]{natbib} -\setlength\bibsep{1pt plus 1pt minus 1pt} - - -%%%%%%%%%%%% Table related %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\RequirePackage{booktabs} -\RequirePackage{array} - -\RequirePackage{dcolumn}% alignment on decimal places -% use d{x.y} to center on "." as in "12.234" -\newcolumntype{d}[1]{D{.}{.}{#1}} -% NB: The above conflicts with babel's Spanish language option which makes "." an active character. -% Instead, to use "," as the decimal separator, choose columntype "," (as in "12,234") -\newcolumntype{,}[1]{D{,}{,}{#1}} - - -%%%%%%%%% Caption related %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% Needs to come before babel messes with the captions, to keep uppercase text. - -\RequirePackage[labelfont={sf,bf},hypcap=false]{caption} -\RequirePackage[list=true,hypcap=false]{subcaption} - -\ExplSyntaxOn -\IfPackageLoadedTF{caption}{ - \cs_if_exist:NT \tag_if_active:T % not in TeX Live 2021 - { - \tag_if_active:T % 2025/11/02 - { - % Patches the caption packages so that asmeconf can validate as pdf 2.0/ua-2. Subcaptions are not specifically addressed. - % See github discussion by Ulrike Fischer: - % https://github.com/latex3/tagging-project/issues/720#issuecomment-2386568711 - % - \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 % this is a hook in the caption package - { - \tagpdfparaOff %leavevmode in parbox should not start paragraph structure - \AssignSocketPlug{tagsupport/parbox/before}{caption} - \AssignSocketPlug{tagsupport/parbox/after}{caption} - } - } - } -% - %\DeclareCaptionLabelFormat{uppercase}{\MakeTextUppercase{#1} #2} % stopped functioning... 2025/11/07 - \DeclareCaptionLabelFormat{uppercasebold}{\small\bfseries\sffamily\MakeTextUppercase{#1}~#2\mathversion{sansbold}} % addressing new strange behavior, 2025/11/07 - \DeclareCaptionLabelFormat{uppercase}{\small\sffamily{\bfseries\MakeTextUppercase{#1}~#2}\mathversion{sans}} % addressing new strange behavior, 2025/11/07 - - \DeclareCaptionTextFormat{boldmath}{\small\bfseries\sffamily\mathversion{sansbold}#1} - \DeclareCaptionTextFormat{sansmath}{\sffamily\mathversion{sans}#1} - - \ifasmeconf@unboldcaption - \captionsetup[figure]{labelformat=uppercase,labelfont={sf,bf,small},textfont={sf,md,small},textformat=sansmath,labelsep=colon} - \captionsetup[table]{ labelformat=uppercase,labelfont={sf,bf,small},textfont={sf,md,small},textformat=sansmath,labelsep=colon,skip=0.5\baselineskip} - \else - \captionsetup[figure]{labelformat=uppercasebold,labelfont={sf,bf,small},textfont={sf,bf,small},textformat=boldmath,labelsep=colon} - \captionsetup[table]{ labelformat=uppercasebold,labelfont={sf,bf,small},textfont={sf,bf,small},textformat=boldmath,labelsep=colon,skip=0.5\baselineskip} - \fi -}{\relax} - -%% Use latex-lab hooks/sockets with recent latex version; useful WITHOUT caption package. No support for subcaptions. 2025/11/08 -% -\cs_new:Nn \__asmeconf_fixcaptions: - { - \setlength\abovecaptionskip{5\p@} % may need some adjustments to this. - \ifasmeconf@unboldcaption - \NewSocketPlug{caption/label}{plug-A} % strictly addresses the caption label, not caption text. - {{\small\bfseries\sffamily ##1:}} % \MakeUppercase{#1} is a bad actor here, so instead cap \figurename below - \AssignSocketPlug{caption/label}{plug-A} - \AddToHook{cmd/@makecaption/before}{\small\sffamily\mathversion{sans}} - \else - \AddToHook{cmd/@makecaption/before}{\small\bfseries\sffamily\mathversion{sansbold}} % This styles the entire caption. - \fi - \AddToHook{cmd/@makecaption/after} - { - \str_if_eq:VnT \@captype {table} { \vskip 0.5\baselineskip} - } - } - -\IfFormatAtLeastTF{2025/11/01} - { - \IfPackageLoadedTF{caption} - { - \tag_if_active:F { \__asmeconf_fixcaptions: } - }{ - \__asmeconf_fixcaptions: - } - }{\relax} - -\ExplSyntaxOff - -%% Capitalize Figure and Table in all languages. -%% Caption package can override this. - -\renewcommand{\fnum@figure}{\MakeTextUppercase{\figurename}~\thefigure} -\renewcommand{\fnum@table} {\MakeTextUppercase{\tablename}~\thetable} - -%%%%%%%%%%%% Font related %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\RequirePackage{mathtools}% loads and extends amsmath - -\ifpdftex - % must load before babel - \RequirePackage[\ac@TtwoA,\ac@Tfive,\ac@LGR,T1]{fontenc} - % T2A - Cyrillic (w/o babel warning); LGR - Greek; T5 - Vietnamese; put T1 last 2022/03/10 -\fi - -\RequirePackage[]{babel} - -\ifpdftex - \RequirePackage[helvratio=.91]{newtxtext}% rescaled 22/03/10 - \RequirePackage[varqu,varl,scale=1.03]{inconsolata}% sans typewriter font % rescaled to 1.05 22/03/10; rescaled to 1.03 2025/03/09 - \RequirePackage[]{newtxmath} -\else - \ifac@fontspec - \RequirePackage[warnings-off={mathtools-colon,mathtools-overbracket},mathbf=sym]{unicode-math} % add mathbf=sym 2025/11/02 - % suppress 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, 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{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 is loaded here. - % Can fall back to TeXGyreTermes if desired, available at: http://www.gust.org.pl/projects/e-foundry/tex-gyre - \setmainfont{TeXGyreTermesX}[ - WordSpace = {1,1.6,1.2},%% This stretch matches newtxtext a little better; rescaled 2024/07/28 - PunctuationSpace = 1.332,%% match fontdimen7 to newtxtext, 2024/07/28 - Extension = .otf, - UprightFont = *-Regular, - ItalicFont = *-Italic, - BoldFont = *-Bold, - BoldItalicFont = *-BoldItalic, - Numbers = Lining, - ] - \setsansfont{texgyreheros}[% Presumes it's installed! http://www.gust.org.pl/projects/e-foundry/tex-gyre - Scale=0.91,% same as for newtx; former value 0.9 too small 2022/01/15 - WordSpace = {1,1,1},% These spacings match newtxtext; rescaled to unity 2024/07/28 - 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.03,% rescaled to 1.05 from 1, 22/03/10; rescaled to 1.03 2025/03/09 - Extension = .otf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - RawFeature = {+ss01,\ssztwo}, % drop +ss03 2025/04/07 - \MonoNotMono,% match newtxtext if we enable wordspacing; note wordspace def'd in option above. - ] - \setmathfont{texgyretermes-math}[% Presumes it's installed! http://www.gust.org.pl/projects/e-foundry/tex-gyre - Scale=MatchUppercase, - Extension = .otf, - BoldFont = *, % termes-math does not have a bold version - ] - \setmathfont[Scale=MatchUppercase,version=bold,FakeBold=3]{texgyretermes-math} - % FakeBold is fairly robust ==>> must be loaded before range substitutions that follow <<=== -% - % 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), bold-face 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} - \SetSymbolFont{lsmgreek}{normal}{TU}{lsm}{m}{n} - \SetSymbolFont{lsmgreek}{bold}{TU}{lsm}{b}{n} -% - \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}, - ] - \setmathfontface\mathrm{FiraMath-Regular.otf}[ - Scale=MatchUppercase, - version=sans, - ] - \setmathfontface\mathbf{FiraMath-Regular.otf}[ - Scale=MatchUppercase, - version=sans, - FakeBold=4, - ] - \DeclareSymbolFont{fsmgreek}{TU}{fsm}{m}{n} - \SetSymbolFont{fsmgreek}{normal}{TU}{fsm}{m}{n} - \SetSymbolFont{fsmgreek}{bold}{TU}{fsm}{b}{n} -% - \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.03,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.03,version=sans]% for tt -% - \setoperatorfont\normalfont % to enable sans or bold operators, etc. -% - %%% The next blocks load fonts for non-Latin scripts. Most are from the extensive Noto font family, but Amiri is called for serifed Arabic. - %%% Font loading is done with \babelfont. Twenty languages are supported. See example file included in this distribution. - % - \ifasmeconf@loadscripts - % For many languages, using babel commands helps font loading. - % Switched Harfbuzz to OpenType throughout, 2024/07/28 - % Noto fonts are available at https://github.com/googlefonts - \def\Noto@scale{0.92} - \def\Ara@scale{0.91}% For the serif font only - \def\NotoBan@scale{0.92}% 1.} should probably stay consistent within the Noto family. - \def\NotoDev@scale{0.92}% 1.} should probably stay consistent within the Noto family. - \def\NotoTam@scale{0.92} - \def\Noto@color{Color=black}% 2024/07/28. Changed this diagnostic command to by-pass a bug in luatexja-fontspec. - % dropping this unused diagnostic option completely, owing to global conflict with luatexja -% - \babelprovide[import, language=Default]{arabic} - \babelfont [arabic]{rm}[Scale=\Ara@scale, - %Renderer=OpenType, - Extension = .ttf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% don't use italic face, I am told - BoldFont = *-Bold,% - BoldItalicFont = *-Bold,% don't use italic face, I am told - ]{Amiri}% NotoNaskhArabic}% Some readers prefer Amiri font - \babelfont [arabic]{sf}[Scale=\Noto@scale, - %Renderer=OpenType, - Extension =.ttf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% font has no italic face - BoldFont = *-SemiBold,% I'm told that legibility better than Bold - BoldItalicFont = *-SemiBold,% font has no italic face - ]{NotoSansArabic}%DejaVuSans}%NotoKufiArabic}% .otf,% - \babelfont [arabic]{tt}[% - %Renderer=OpenType, - Extension =.ttf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-SemiBold,% I'm told that legibility is better than Bold - BoldItalicFont = *-SemiBold,% has no italic face - ]{NotoSansArabic}%same as above! - \providecommand\arabicabstractname{ملخص}% NB: utf-8 -% - \babelprovide[import,language=Default,script=Bangla]{bengali} - \babelfont [bengali]{rm}[% - %Renderer=OpenType, - Scale=\NotoBan@scale,% same as Devanagari - % \Noto@color, - Extension = .ttf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSerifBengali} - \babelfont [bengali]{sf}[% - %Renderer=OpenType, - Scale=\NotoBan@scale, - % \Noto@color, - Extension = .ttf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSansBengali} - \babelfont [bengali]{tt}[ - %Renderer=OpenType, - Scale=\NotoBan@scale, - % \Noto@color, - Extension = .ttf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSansBengali} -% - % Cyrillic languages - \NewDocumentCommand\ac@LoadBabelCyr{>{\SplitList{;}}m}{\ProcessList{#1}{\ac@CyrillicBabel}} - \NewDocumentCommand\ac@CyrillicBabel{m}{% - \babelprovide[import,language=Default,script=Cyrillic]{#1} % rescaled 2025/03/14 - \babelfont [#1]{rm}[% - % Scale=\Noto@scale, - Scale=0.84,%\Noto@scale, % matching x-height to Termes - WordSpace = {1.14,1.8,1.37}, - PunctuationSpace = 1.52, - % \Noto@color, - Extension = .ttf, - UprightFont = *-Regular, - ItalicFont = *-Italic, - BoldFont = *-Bold, - BoldItalicFont = *-BoldItalic,% - ]{NotoSerif} - \babelfont [#1]{sf}[% - % Scale=\Noto@scale, - Scale=0.8896,%\Noto@scale, % matching x-height to Heros - WordSpace={1.094},% increase word spacing slightly - PunctuationSpace = 1.094,%% match fontdimen7 - % \Noto@color, - Extension = .ttf, - UprightFont = *-Regular, - ItalicFont = *-Italic, - BoldFont = *-Bold, - BoldItalicFont = *-BoldItalic,% - ]{NotoSans} - \babelfont [#1]{tt}[% - Scale=0.878,%\Noto@scale, % matching x-height to Inconsolata - % \Noto@color, - Extension = .ttf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSansMono} - } - \ac@LoadBabelCyr{russian;belarusian;bulgarian;macedonian;serbian-cyrillic;ukrainian}% serbianc has no .ini under fontspec - \setlocalecaption{serbian-cyrillic}{abstract}{Сажетак}% NB: utf-8 -% - % Devanagari languages - \newfontscript{Devanagari}{deva}% OpenType has some problems in Hindi, see babel manual Sect. 1.13 (main issue is ra) - \NewDocumentCommand\ac@LoadBabelDev{>{\SplitList{;}}m}{\ProcessList{#1}{\ac@DevBabel}} - \NewDocumentCommand\ac@DevBabel{m}{% - \babelprovide[import,language=Default]{#1} - \babelfont [#1]{rm}[% - % %Renderer=OpenType,% Marathi and Hindi may respond differently... - Scale=\NotoDev@scale, - % \Noto@color, - Extension = .ttf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSerifDevanagari} - \babelfont [#1]{sf}[% - % %Renderer=OpenType,% % Marathi and Hindi may respond differently... - Scale=\NotoDev@scale, - % \Noto@color, - Extension = .ttf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSansDevanagari} - \babelfont [#1]{tt}[ - % %Renderer=OpenType,% % Marathi and Hindi may respond differently... - Scale=\NotoDev@scale, - % \Noto@color, - Extension = .ttf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSansDevanagari} - } - \ac@LoadBabelDev{hindi;marathi;kashmiri;nepali;sanskrit} - % No .ldf files for these languages, but they do have .ini files. Nepali: no abstractname -% - % Greek - \babelprovide[import,language=Default]{greek} % adjust scales 2025/03/14 - \babelfont [greek]{rm}[% - Scale=0.84,%\Noto@scale, - WordSpace = {1.14,1.8,1.37}, - PunctuationSpace = 1.52, - % WordSpace={1.1},% increase word spacing slightly - % \Noto@color, - Extension = .ttf, - UprightFont = *-Regular, - ItalicFont = *-Italic, - BoldFont = *-Bold, - BoldItalicFont = *-BoldItalic,% - ]{NotoSerif} - \babelfont [greek]{sf}[% - Scale=0.8896,%\Noto@scale, - WordSpace={1.094},% increase word spacing slightly - PunctuationSpace = 1.094,%% match fontdimen7 - % \Noto@color, - Extension = .ttf, - UprightFont = *-Regular, - ItalicFont = *-Italic, - BoldFont = *-Bold, - BoldItalicFont = *-BoldItalic,% - ]{NotoSans} - \babelfont [greek]{tt}[% - Scale=0.878,%\Noto@scale, - % \Noto@color, - Extension = .ttf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSansMono} -% - % Korean - \babelprovide[import,language=Default]{korean} - \babelfont [korean]{rm}[% - Scale=\Noto@scale, - % \Noto@color, - Extension = .otf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSerifCJKkr} - \babelfont [korean]{sf}[% - Scale=\Noto@scale, - % \Noto@color, - Extension = .ttc, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSansCJK} - \babelfont [korean]{tt}[% - Scale=\Noto@scale, - % \Noto@color, - % Extension = .ttc, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSansMonoCJKkr} - \renewcommand\koreanabstractname{초록} % NB: utf-8 -% - % Simplified Chinese - \babelprovide[import,language=Default]{chinese-simplified} % throws an error when tagging is active, 2025/03/06 - \babelfont [chinese-simplified]{rm}[% - Scale=\Noto@scale, - % \Noto@color, - Extension = .otf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSerifCJKsc} - \babelfont [chinese-simplified]{sf}[% - Scale=\Noto@scale, - % \Noto@color, - Extension = .ttc, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSansCJK} - \babelfont [chinese-simplified]{tt}[% - Scale=\Noto@scale, - % \Noto@color, - % Extension = .ttc, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSansMonoCJKsc} - % - % Traditional Chinese (includes characters for Cantonese also) - \babelprovide[import,language=Default]{chinese-traditional} % throws an error when tagging is active, 2025/03/06 - \babelfont [chinese-traditional]{rm}[% fixed 2024/07/28 - Scale=\Noto@scale, - % \Noto@color, - Extension = .otf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSerifCJKtc} - \babelfont [chinese-traditional]{sf}[% - Scale=\Noto@scale, - % \Noto@color, - Extension = .ttc, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSansCJK} - \babelfont [chinese-traditional]{tt}[Scale=\Noto@scale,\Noto@color]{NotoSansMonoCJKtc} - % - \babelprovide[import,language=Default]{tamil} - \babelfont [tamil]{rm}[% - %Renderer=OpenType, - Scale=\NotoTam@scale, - % \Noto@color, - Extension = .ttf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSerifTamil} - \babelfont [tamil]{sf}[% - %Renderer=OpenType, - Scale=\NotoTam@scale, - % \Noto@color, - Extension = .ttf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSansTamil} - \babelfont [tamil]{tt}[ - %Renderer=OpenType, - Scale=\NotoTam@scale, - % \Noto@color, - Extension = .ttf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSansTamil} - % - \babelprovide[import, captions/abstract = Muhtasari, language = Default]{swahili} - \fi - % - % Japanese - % luatexja-fontspec seems to want lc "color" now, rather than normal "Color", as before. Commenting out. - % ongoing issues with color in these fonts, conflicting with Greek and Russian. Eliminating color from all three. 2025/03/07 - % NB: luatexja-fontspec color breakage appears to be global. - \ifac@japanese -% \let\savNoto@color\Noto@color -% \def\Noto@color{}% by-pass bug in luatexja-fontspec, 2024/07/28. - \RequirePackage[no-math]{luatexja-fontspec}% japanese typesets *much* better with this loaded - \setmainjfont{NotoSerifCJKjp}[% - Scale=0.92, -% \Noto@color, -% Extension = .otf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ] - \setsansjfont{NotoSansCJKjp}[% - Scale=0.92, -% \Noto@color, -% Extension = .ttc, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ] - \setmonojfont{NotoSansMonoCJKjp}[% - Scale=0.92, -% \Noto@color, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ] - \ltjsetparameter{jacharrange={-1, -2, +3, -4, -5, +6, +7, +8}}% this prevents luatexja from breaking Russian and Greek. - % see: https://tex.stackexchange.com/questions/222320/russian-in-document-with-japanese-as-main-language-lualatex-ltjsarticle - % Need at least one of the following to load the Japanese dictionary. - \babelfont [japanese]{rm}[% - Scale=0.92, -% \Noto@color, - Extension = .otf, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSerifCJKjp}% Scale estimated - \babelfont [japanese]{sf}[% - Scale=0.92, -% \Noto@color, -% Extension = .ttc, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSansCJKjp} - \babelfont [japanese]{tt}[% - Scale=0.92, -% \Noto@color, -% Extension = .ttc, - UprightFont = *-Regular, - ItalicFont = *-Regular,% has no italic face - BoldFont = *-Bold, - BoldItalicFont = *-Bold,% has no italic face - ]{NotoSansMonoCJKjp}% renders same as Sans! -% \let\Noto@color\savNoto@color - \fi - % Note: \japaneseabstractname is not defined if japanese is not called as a package option. -% - \else % use lualatex without support for system fonts (enables luacode for numerics while retaining newtx etc.) - % dropped newtxtext completely, 2024/01/19 - \renewcommand*\rmdefault{ntxtlf} % roman font for math - \RequirePackage[T1]{fontenc} % qhv and zi4 are not TU encoded, 2021/12/24 - \DeclareFontFamily{T1}{\sfdefault}{} % sf for math - \DeclareFontShape{T1}{\sfdefault}{m}{n}{<-> s*[0.91] ec-qhvr}{} %% see t1qhv.fd; 0.9-->0.94 2022/01/15; 0.94-->0.91, 2025/04/08 - \DeclareFontShape{T1}{\sfdefault}{b}{n}{<-> s*[0.91] ec-qhvb}{} %% see t1qhv.fd; 0.9-->0.94 2022/01/15; 0.94-->0.91, 2025/04/08 - \DeclareFontShape{T1}{\sfdefault}{bx}{n}{<-> s*[0.91] ec-qhvb}{} %% see t1qhv.fd; 0.9-->0.94 2022/01/15; 0.94-->0.91, 2025/04/08 - \RequirePackage[varqu,varl,scale=1.03]{inconsolata}% sans typewriter font, revised 2025/04/11 - \RequirePackage[]{newtxmath} % options will be as passed from newtx - \fi -\fi - -%% the bm package is loaded only without unicode-math (bm = bold math macro) -\ifac@fontspec - \let\bm\symbf % in case of user error... -\else - \RequirePackage{bm}% load after all math -\fi - -% 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}} - - -% The article class calls \sloppy in two-column mode (\tolerance 9999, \emergencystretch 3em) -% The following 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 - -%\RequirePackage{hologo}% Moved to .tex file, 2025/03/26. Dropped metalogo, 2024/08/09. - -%% font size selection -%% ASME's specs differ slightly from latex standard article-10 class -\renewcommand\LARGE{\@setfontsize\LARGE{16}{19.2}} %{18}{21.6}} updated 2019/7/7 to match new ASME spec. - % ...default is 17.28/22 ... used for paper# -\renewcommand\large{\@setfontsize\large{11}{13.6}} % default is 12/14 ... used for headings - -%\renewcommand\Large{\@setfontsize\Large{14.4}{18}} % same as default -%\renewcommand\normalsize{\@setfontsize\normalsize{10}{12}} % same as default -%\renewcommand\small{\@setfontsize\small{9}{11}} % same as default -%\renewcommand\footnotesize{\@setfontsize\footnotesize{8}{9.5}} % same as default - - -%% set up sansbold and sans mathversions for pdftex -\ifac@fontspec\else - %% This provides sans-serif italic and sans-serif bold italic math. - %% These fonts are for use in the figure captions and section headings. - %% Use \mathbf{..}, \mathversion{bold}, or \bm{..} elsewhere. - \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 25 Jan 2021 - \SetSymbolFont{largesymbolsTXA}{sansbold}{U}{ntxexa}{b}{n}% added 25 Jan 2021 - \SetSymbolFont{operators}{sansbold}{OT1}{\sfdefault}{\bfdefault}{n}% fixed encoding 2025/04/07 - \SetMathAlphabet{\mathsf}{sansbold}{\encodingdefault}{\sfdefault}{b}{n}% changed from it, 2021/01/31: \mathsf is upright. - - %% Added 2023/10/19 - \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/07 - \SetMathAlphabet{\mathsf}{sans}{\encodingdefault}{\sfdefault}{m}{n}% \mathsf is upright. -\fi - -%%%%%%%% Footers and Footnotes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\RequirePackage{fancyhdr} -\pagestyle{fancy} - -\AtBeginDocument{\edef\ac@EncodingMain{\encodingdefault}} -\ExplSyntaxOn - \cs_new:Npn \ac@SetFont { - \fontencoding\ac@EncodingMain\selectfont - \selectlanguage{english}% add english to deal with lualatex, 2025/03/18 - } -\ExplSyntaxOff - -\fancyfoot{} -\fancyhead{} -\fancyfoot[CE,CO]{\ac@SetFont\thepage}% force encoding so that passages in some languages won't switch footer font from the main font. -\fancyfoot[RO,RE]{\ac@SetFont Copyright \textcopyright \the\year\ by ASME} -\renewcommand{\headrulewidth}{0pt} -\renewcommand{\footrulewidth}{0pt} - -\ifasmeconf@govt - \newgeometry{left=0.5in, right=0.5in, top=0.5in, bottom = 1.in, footskip = 0.3in, columnsep = 0.38in} - \fancyfoot[RO,RE]{} - \fancyfoot[CE,CO]{\ac@SetFont\thepage\\[1ex]\small 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 - -\ifasmeconf@contractor - \newgeometry{left=0.5in, right=0.5in, top=0.5in, bottom = 1.in, footskip = 0.3in, columnsep = 0.38in} - \fancyfoot[RO,RE]{} - \fancyfoot[CE,CO]{\ac@SetFont\thepage\\[1ex]\footnotesize 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 - -\ifasmeconf@govtsome - \newgeometry{left=0.5in, right=0.5in, top=0.5in, bottom = 1.in, footskip = 0.3in, columnsep = 0.38in} - \fancyfoot[RO,RE]{} - \fancyfoot[CE,CO]{\ac@SetFont\thepage\\[1ex]\small 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 - -\ifasmeconf@nofoot - \fancyfoot[RO,RE]{} -\fi - -%%%%%% Footnotes %%%%%%% - -\RequirePackage{footmisc}% -\IfPackageAtLeastTF{footmisc}{2022/02/05}{ - \PassOptionsToPackage{belowfloats}{footmisc}% - }{ \RequirePackage{fnpos}% this package is not loaded if footmisc is up to date. - \makeFNbottom - \makeFNbelow - }% -\setlength\footnotemargin{2ex}% reduce indentation of footnotes, from footmisc -\setlength{\skip\footins}{\baselineskip}% <=== per ASME, 1 extra line - -\renewcommand{\footnoterule}{% - \kern -3pt - \hrule width 0.5in height 0.4pt - \kern 2pt -} - -%% include a comma for sequential footnotes. 2024/01/18 -\ExplSyntaxOn - \cs_new:Npn \__asmeconf_NoteComma:n { \peek_meaning:NT \footnote { \textsuperscript{\mdseries,} } } - \cs_new_eq:NN \__asmeconf_savefootnote: \footnote - \cs_gset_protected:Npn \footnote #1 { \__asmeconf_savefootnote: {#1} \__asmeconf_NoteComma:n } -\ExplSyntaxOff - - -%%%%%%%%% Section headings %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% ASME specifies 10 pt headings - -%% This approach is intended to avoid breaking tagging code, 2025/01/29 -\renewcommand\section{\@startsection {section}{1}{\z@}% - {12pt \@plus 4pt \@minus 2pt}% - {1pt \@plus 2pt \@minus 2pt}% - {\mathversion{sansbold}\normalsize\bfseries\sffamily\raggedright\MakeTextUppercase}} -% {\mathversion{sansbold}\normalsize\bfseries\sffamily\raggedright\MakeTextUppercase}} -\renewcommand\subsection{\@startsection {subsection}{2}{\z@}% - {12pt \@plus 4pt \@minus 2pt}% - {1pt \@plus 1pt \@minus 1pt}% - {\mathversion{sansbold}\normalsize\bfseries\sffamily\raggedright}} -\renewcommand\subsubsection{\@startsection {subsubsection}{3}{\parindent}% - {6pt \@plus 3pt \@minus 2pt}% - {-0.5em}% - {\mathversion{sansbold}\bfseries\normalsize\sffamily}} -\patchcmd{\thesection}{\@arabic\c@section}{\@arabic\c@section}{}{} -\patchcmd{\thesubsection}{\thesection.\@arabic\c@subsection}{\@arabic\c@section.\@arabic\c@subsection}{}{} -\patchcmd{\@seccntformat}{\quad}{.\hspace{0.5em}}{}{} -\patchcmd{\@ssect}{\relax #5}{\relax #5.}{}{}% only \subsubsection* will follow this path -\let\paragraph\subsubsection - -\ExplSyntaxOn -\cs_new_protected:Nn \__asmeconf_change_hangindent: { - \cs_if_exist:NT \@kernel@tag@hangfrom { - \cs_new_eq:NN \__asmeconf_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 } - { \tag_mc_begin:n { tag=Lbl } } - {##1} - } - \tag_suspend:n{hangfrom} - % \hangindent \wd\@tempboxa\noindent %% changing this line only - \hangindent 0pt\noindent - \tag_resume:n{hangfrom} - \tag_mc_begin:n {}\box\@tempboxa\tag_mc_end:\tagstructend\tag_mc_begin:n {} - } - \cs_set_eq:NN \@kernel@tag@hangfrom \@app@kernel@tag@hangfrom - } - \cs_new_eq:NN \__asmeconf_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 - \__asmeconf_change_hangindent: - \setcounter{section}{0} - \setcounter{subsection}{0} - \gdef\thesection{\@Alph\c@section} - \gdef\thesubsection{\@Alph\c@section.\@arabic\c@subsection} - \pretocmd{\section}{\gdef\@seccntformat##1{\appendixname\ \csname the##1\endcsname.\hspace{0.5em}}}{}{} - \pretocmd{\section}{\def\@hangfrom{\@app@hangfrom}}{}{} - \pretocmd{\section}{\def\@kernel@tag@hangfrom{\@app@kernel@tag@hangfrom}}{}{} - \pretocmd{\subsection}{\gdef\@seccntformat##1{\csname the##1\endcsname.\hspace{0.5em}}}{}{} - \pretocmd{\subsection}{\def\@hangfrom{\__asmeconf_sav@hangfrom}}{}{} - \pretocmd{\subsection}{\def\@kernel@tag@hangfrom{\__asmeconf_sav@kernel@tag@hangfrom}}{}{} -} -\ExplSyntaxOff - -%% Let's also add \footnote to the \TextUppercase exception list, so that footnote text won't be capitalized -%% if given in a section heading. Ditto for \eqref -% -\ifx\AddToNoCaseChangeList\@undefined % updated 2022/07/03, see https://github.com/John02139/asmeconf/issues/5 - \patchcmd{\@uclcnotmath}{\@nonchangecase\ref}{\@nonchangecase\ref\@nonchangecase\footnote\@nonchangecase\eqref}{\typeout{Asmeconf patched textcase nonchangecase to include footnote and eqref.}}{} -\else - \AddToNoCaseChangeList{\eqref \footnote} -\fi - - -%%%%%%%%%% Hyperref %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\ifpdftex - %%% to assist with unicode glyph mapping, following M. Sharpe's recommendation in the newtx documentation. - %%% as of 2025/04/17, both are still necessary for \DocumentMetadata{pdfstandard=A-3u}. - \InputIfFileExists{glyphtounicode-cmr.tex}{}{} %% additional mappings - \InputIfFileExists{glyphtounicode-ntx.tex}{}{} %% additional mappings -\fi - -\RequirePackage[psdextra]{hyperref} % recent kernel transition suggests providing most hyperref options via \hypersetup, - % but setting psdextra here (for additional math support in bookmarks) 2021/12/01 -\hypersetup{% - pdfborder={0 0 0},% - bookmarksnumbered=true,% - bookmarksopen=true, - bookmarksopenlevel=1,% - linkcolor=blue, % - citecolor=blue, % - urlcolor=blue, % - filecolor=red, % added 2021/12/02, to make certain broken links more apparent - pdfnewwindow=true,% - pdfpagelayout=SinglePage, - pdfdisplaydoctitle=true% -% colorlinks=true,% <=== set true to get colored type, but do so via package options in .tex file -} - -\urlstyle{same} % don't switch to typewriter font for urls -\RequirePackage{doi} % supports the nasty characters in some doi's -\renewcommand{\doitext}{DOI } % change to this from default value, {doi:}, per 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{..} - - -%%% ==> recent development of \pdfstring removes all robust commands from bookmarks, so that -%%% by early 2024, errors are not present; the following serve to suppress warnings. - -%% Since \bm may be useful in headings, this fix will reduce frequency with which -%% alternate pdfstrings must be given in revised 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 also make sure \NoCaseChange in section headings won't break pdf bookmarks -\pdfstringdefDisableCommands{% - \let\NoCaseChange\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})}% \ref* is from hyperref -} - -% Let's make sure footnotes in section headings don't break pdf bookmarks. -% Revised footnote command above is already robust -\pdfstringdefDisableCommands{% - \def\footnote#1{}% -} - -%%% There should be no errors for section headings with \(, \), \cite, \ref, \eqref, \label, \footnote, \NoCaseChange, or \bm - - -%%%%%%%%%%%%% CSS styling if the pdf is tagged and rendered into HTML %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\ExplSyntaxOn -\cs_if_exist:NT \tag_if_active:T % not in TeX Live 2021 -{ - \tag_if_active:T % 2025/11/02 - { - % Can include some css to style the html-rendered document - \msg_new:nnn { \ClassName } { no_css_file } {I~can't~find~the~file~asmeconf-style.css.\iow_newline: - This~optional~file~provides~css~style~if~the~tagged~pdf~is~rendered~into~html.~ - You~can~ignore~this~warning~if~you~don't~want~styling.} - \msg_new:nnn { \ClassName } { css_file_loaded } {The~file~asmeconf-style.css~has~been~loaded.} - \file_if_exist:nTF {asmeconf-style.css} - { - \tagpdfsetup { - css-list-add = { asmeconf-style.css } % attach this css to the pdf - } - \msg_note:nn { \ClassName } { css_file_loaded } - }{ - \msg_note:nn { \ClassName } { no_css_file } - } - } -} -\ExplSyntaxOff - - -%%%%%%%%%%%%% Line numbering and balancing columns on last page %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%% Adjustments when [lineno] option is used -\ifasmeconf@lineno% - \RequirePackage[switch,mathlines]{lineno} - \renewcommand{\linenumberfont}{\normalfont\footnotesize\color{red}} - \AtBeginDocument{\linenumbers} - \ifasmeconf@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 patch 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{\ac@losepostpenalty}{}{\patchcmd{\linenomathWithnumbers}{\advance\postdisplaypenalty\linenopenalty}{}{}{}} - % - \NewDocumentCommand{\ac@FixAMSMath}{m}{% - \AtBeginEnvironment{#1}{\ac@losepostpenalty\linenomath}% - \AtEndEnvironment{#1}{\endlinenomath}% - \AtBeginEnvironment{#1*}{\ac@losepostpenalty\linenomath}% - \AtEndEnvironment{#1*}{\endlinenomath}% - } - % - \NewDocumentCommand{\ac@FixAll}{>{\SplitList{;}}m}{\ProcessList{#1}{\ac@FixAMSMath}} - % - \ac@FixAll{align;alignat;gather;flalign;multline} - } -\else - \ProvideDocumentEnvironment{linenomath}{}{}{}% - \ifasmeconf@balance - \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}% Enable dropping lineno option without needing to trash .aux file -\providecommand{\@LN}[2]{\relax} - - -%%%%%%%%%%%%% Define special environments %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%% Introduce some special section and other names %%%%%%%%%%% - -\providecommand{\nomname}{Nomenclature} -\providecommand{\keywordname}{Keywords} -%\providecommand{\appendicesname}{APPENDICES} % no longer used, 2025/04/11 -\providecommand{\JAwords}{Joint~first~authors} -\providecommand{\CAwords}{Corresponding~author} - -%% Abstract environment %%%%%%%%%%%%%%%%%% -%% \keywords command should be given someplace before the \end{abstract} command. - -\ExplSyntaxOn - -\tl_new:N \g_asmeconf_keywords_tl -\cs_new_protected:Nn \__asmeconf_gset_keywords:n - { - \tl_gset:Nn \g_asmeconf_keywords_tl { #1 } - } -\NewDocumentCommand{\keywords}{m}{ - \__asmeconf_gset_keywords:n { #1} - } - -\cs_new:Nn \__asmeconf_keywords: - { - \tl_if_blank:VTF \g_asmeconf_keywords_tl - { - \scan_stop: - } - { - \par - \skip_vertical:n { 3pt plus 1pt minus 1pt } - \noindent - \upshape - \tag_struct_begin:n { tag=Strong } - \tag_mc_begin:n { tag=Strong } - {\sffamily - { \bfseries \keywordname : }~ - } - \g_asmeconf_keywords_tl - \tag_mc_end: - \tag_struct_end: - \par - } - } - -\DeclareDocumentEnvironment{abstract}{+b}{% Overwrites default abstract environment - \section*{\abstractname}\itshape - #1 - } - { - \__asmeconf_keywords: - \par\ignorespacesafterend - } -\ExplSyntaxOff - -\NewDocumentEnvironment{abstract*}{+b}{% Abstract with no keywords (same as using empty \keywords{} with abstract env.) - \section*{\abstractname}\itshape - #1 - } - { - \par\ignorespacesafterend % \par needed to present spurious vertical space after full line in lualatex, 2025/03/18 - } - -%% Nomenclature environment %%%%%%%%%%%%%%%%%% -%% - -\newlength\nomenwidth -\newlength\savitemsep - -\NewDocumentCommand\entry{m m}{% simplified greatly 2024/01/18 - \item[#1\hfill]#2% - \@itempenalty=-\@lowpenalty -} - -%% A separate command command for nomenclature subheadings -\NewDocumentCommand\EntryHeading{m}{% - \itemsep3\p@ plus 1\p@ minus 1\p@ - \goodbreak\item[\emph{#1}\hfill]\mbox{}% - \setlength{\itemsep}{\savitemsep}\@itempenalty=1000 -} - -%% Increase first optional argument to a dimension > 2em if wide entries cause undesired misalignment of columns. -%% Second optional argument can be used to rename the environment, e.g., to List of Symbols. -\NewDocumentEnvironment{nomenclature}{O{2em} O{\nomname}}{% - \setlength{\columnsep}{2em} - \setlength{\nomenwidth}{#1} - \section*{#2} - \raggedright - \begin{list}{}{% - \setlength{\itemsep}{0pt}% - \setlength{\parsep}{\itemsep}% - \setlength{\labelsep}{1em}% - \setlength{\labelwidth}{\nomenwidth}% - \setlength{\leftmargin}{\labelwidth}% - \addtolength{\leftmargin}{\labelsep}% - \setlength{\savitemsep}{\itemsep}% - }% -}{\end{list} - \ignorespacesafterend -} - - -%%%%%%%%%%%%%%%%% Headers and Title %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\ExplSyntaxOn - -\tl_new:N \g__asmeconf_confname_tl -\tl_gset:Nn \g__asmeconf_confname_tl { {\itshape Missing~conference~name!} } -\tl_new:N \g__asmeconf_confacronym_tl -\tl_gset:Nn \g__asmeconf_confacronym_tl { {\itshape Missing~conference~acronym!} } -\tl_new:N \g__asmeconf_confdate_tl -\tl_gset:Nn \g__asmeconf_confdate_tl { {\itshape Missing~conference~date!} } -\tl_new:N \g__asmeconf_confcity_tl -\tl_gset:Nn \g__asmeconf_confcity_tl { {\itshape Missing~conference~city!} } -\tl_new:N \g__asmeconf_papernumber_tl -\tl_gset:Nn \g__asmeconf_papernumber_tl { Add~paper~number } -\tl_new:N \g__asmeconf_papertitle_tl -\tl_gset:Nn \g__asmeconf_papertitle_tl { {\itshape Missing~title!} } - -\NewDocumentCommand\ConfName{m}{ \tl_gset:Nn \g__asmeconf_confname_tl { \tl_trim_spaces:n {#1} } } -\NewDocumentCommand\ConfDate{m}{ \tl_gset:Nn \g__asmeconf_confdate_tl { \tl_trim_spaces:n {#1} } } -\NewDocumentCommand\ConfCity{m}{ \tl_gset:Nn \g__asmeconf_confcity_tl { \tl_trim_spaces:n {#1} } } -\NewDocumentCommand\ConfAcronym{m}{ - \tl_gset:Nn \g__asmeconf_confacronym_tl { \tl_trim_spaces:n \str_uppercase:f {#1} } -} -\NewDocumentCommand\PaperNo{m}{ - \tl_gset:Nn \g__asmeconf_papernumber_tl { \tl_trim_spaces:n \str_uppercase:f {#1} } -} - -\cs_new_protected:Nn \__asmeconf_gset_papertitle:n { - \tl_gset:Nn \g__asmeconf_papertitle_tl { \tl_trim_spaces:n {#1} } - \gdef\@title{#1}% added 2024/07/28, use \gdef for consistency with other latex usage -} - -\cs_new:Nn \__asmeconf_nbaseline_skip:n { - \skip_vertical:n { #1\baselineskip } -} - -\tagpdfsetup { role/user-NS = asmeconf } -\tagpdfsetup { role/new-tag = { Conference_information/Div } } -\cs_new:Nn \__asmeconf_headertitle: { - \begingroup\bfseries\sffamily - \ifasmeconf@nohead - \__asmeconf_nbaseline_skip:n {5} - { \LARGE \hbox:n { } \__asmeconf_nbaseline_skip:n {1} } - \__asmeconf_nbaseline_skip:n {3} - \else - \tag_struct_begin:n { tag=Conference_information } - \parbox{\linewidth}{ - \raggedleft - \g__asmeconf_confname_tl \par - \g__asmeconf_confacronym_tl \par - \g__asmeconf_confdate_tl ,\c_space_tl \g__asmeconf_confcity_tl - } - \par\tag_struct_end: - \__asmeconf_nbaseline_skip:n {2} - \tag_struct_begin:n{tag=Div, title=Paper~number} - \parbox{\linewidth}{\raggedleft\LARGE - \g__asmeconf_papernumber_tl - } - \par\tag_struct_end: - \__asmeconf_nbaseline_skip:n {3} - - \fi - \tag_struct_begin:n{tag=Title, title=Title} - \parbox{\linewidth}{\mathversion{sansbold}\centering{\large - \MakeTextUppercase{ \g__asmeconf_papertitle_tl }\par}% <=== Extra \par makes the font leading stick. See adjustment in \MakeTitle. - } % Using \MakeTextUppercase to enable \NoCaseChange when it's needed. - \endgroup - \tag_struct_end: -} - -%%%%%%%%%%% Author and affiliation block %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% Inline author style resets the footnote mark; save the definitions so we can restore them later -\cs_gset_eq:NN \savethefootnote \thefootnote -\cs_gset_eq:NN \savemakefnmark \@makefnmark - -%% Flag for joint first authors (two or more) -\bool_new:N \g__asmeconf_JA_bool - -\NewDocumentCommand{\JointFirstAuthor}{}{% - \bool_gset_true:N \g__asmeconf_JA_bool - \ifac@fontspec - $^{\textbf{\textrm{\dagger}}}$\ignorespaces - \else - $\bm{^\dagger}$\ignorespaces % \ignorespaces is ignored due to code for commas in successive footnotes, below. - \fi -} -%% Flag for corresponding author (expecting just one, but if two enter both email addresses and flag both authors) -\bool_new:N \g__asmeconf_CA_bool - -% backward compatibility -\cs_if_exist:NF \str_case_e:enTF { \cs_generate_variant:Nn \str_case_e:nnTF {enTF} } - -\tl_new:N \g__asmeconf_CAsep_tl -\tl_new:N \g__asmeconf_CAemail_tl -\NewDocumentCommand\CorrespondingAuthor{>{\TrimSpaces} m}{% Revised 2020/12/29 (make CA email mandatory but possibly empty); edit 2025/01/27 - \bool_gset_true:N \g__asmeconf_CA_bool - \tl_if_blank:nTF {#1} { - \tl_gset:Nn \g__asmeconf_CAsep_tl { \scan_stop: } - \tl_gset:Nn \g__asmeconf_CAemail_tl { \scan_stop: } - }{ - \tl_gset:Nn \g__asmeconf_CAsep_tl { :\space } - \tl_gset:Nn \g__asmeconf_CAemail_tl { #1 } - } - \ifac@fontspec % modified 2025/03/16 to deal with occasional tofu; likely to need additional options for other scripts - \str_case_e:enTF { \g__asmeconf_main_str } - { - {greek}{} {russian}{} {ukrainian}{} {serbianc}{} {macedonian}{} {belarusian}{} {bulgarian}{} - } - { {\mathversion{bold}$^{\ast}$}\ignorespaces } - { \ifac@japanese% shouldn't be needed, but it is...2025/03/26 - \mathversion{bold}$^{\ast}$\ignorespaces - \else - $^{\textbf{\textrm{\ast}}}$\ignorespaces - \fi - } - \else - $\bm{^\ast}$\ignorespaces %\ignorespaces is ignored due to code for commas in successive footnotes, below. - \fi -} -\ExplSyntaxOff - -%%%% option to use the traditional grid layout of authors or the inline style - -\ifasmeconf@grid - \ClassNoteNoLine{\ClassName}{Selected option for a grid of author blocks}% - - %%%%%%%%%%%%%%%%%%%% Gridded author layout %%%%%%%%%%%%%%%%%%%%%%%%% - %% - %% converted to expl3 18 August 2024 - - \ExplSyntaxOn - %% Allows for up to fifteen author blocks. - \coffin_new:N \g__asmeconf_authorblock_coffin - \coffin_new:N \g__asmeconf_firstrowauthorblock_coffin - \coffin_new:N \g__asmeconf_secondrowauthorblock_coffin - \coffin_new:N \g__asmeconf_thirdrowauthorblock_coffin - \coffin_new:N \g__asmeconf_fourthrowauthorblock_coffin - \coffin_new:N \g__asmeconf_fifthrowauthorblock_coffin - - \dim_new:N \g__asmeconf_coffinsep_dim - \dim_gset:Nn \g__asmeconf_coffinsep_dim { 0.03\textwidth } - - \dim_new:N \g__asmeconf_authorblockwidth_dim - \dim_gset:Nn \g__asmeconf_authorblockwidth_dim { 0.3\textwidth } - - \seq_new:N \g__asmeconf_author_seq - \seq_new:N \g__asmeconf_authoraffil_seq - \seq_new:N \g__asmeconf_affiliation_seq - - - \int_gzero_new:N \g__asmeconf_authorcnt_int - - \NewDocumentCommand\SetAuthors{>{\SplitList{,}}m}{ - \ProcessList{#1}{ \__asmeconf_gset_author:n } - } - \cs_new_protected:Nn \__asmeconf_gset_author:n - { - \int_gincr:N \g__asmeconf_authorcnt_int - \tl_if_empty:nT {#1} { - \msg_warning:nn { \ClassName } { missingauthor } - } - \seq_gput_right:Nn \g__asmeconf_author_seq {#1} - \__asmeconf_stripaffilnumber:n { #1 } - \seq_gput_right:Nn \g__asmeconf_affiliation_seq { \c_empty_tl } % clear sequence for later use - \seq_gput_right:NV \g__asmeconf_authoraffil_seq \g__asmeconf_affiltagno_int - } - \msg_new:nnn { \ClassName } { missingauthor } { Missing~author~name,~check~for~extra~comma~in~\SetAuthors! } - - %% The following captures the affiliation tag number from the \SetAuthors command. - %% It would be simpler to replace \affil{#} by an additional _argument_ in \SetAuthors; - %% however, legacy syntax seem pretty locked in... - \int_gzero_new:N \g__asmeconf_affiltagno_int - \cs_new_protected:Nn \__asmeconf_stripaffilnumber:n - { - \int_zero_new:N \l__asmeconf_affil_flag_int - \tl_set:Nn \l_tmpa_tl { #1 } - \tl_map_inline:Nn \l_tmpa_tl - { -% \int_if_zero:nTF { \l__asmeconf_affil_flag_int } % not added to expl3 until 2023-05-17 - \int_compare:nTF { \l__asmeconf_affil_flag_int = 0 } - { - \tl_if_eq:nnT { ##1 } { \affil } { \int_incr:N \l__asmeconf_affil_flag_int } - }{ - \tl_map_break:n { - \tl_if_blank:nTF { ##1 } - { - \msg_error:nn { \ClassName } { missingaffilno } - }{ - \int_gset:Nn \g__asmeconf_affiltagno_int { ##1 } - \int_set:Nn \l__asmeconf_affil_flag_int {0} - } - } - } - } - } - \NewDocumentCommand\affil{m}{} - \msg_new:nnn { \ClassName } { missingaffilno } { Missing~number~in~\affil{..}~tag! } - - \NewDocumentCommand\SetAffiliation{mm}{ - \__asmeconf_gset_affiliation:nn {#1}{#2} - } - \cs_new_protected:Nn \__asmeconf_gset_affiliation:nn - { - \seq_gset_item:Nnn \g__asmeconf_affiliation_seq {#1} {#2} % this command added to L3 2021/04/29 - } - - \cs_new:Nn \__asmeconf_setauthorblock: { - \int_zero_new:N \l__asmeconf_authorno_int - \int_zero_new:N \l__asmeconf_authoraffilno_int - \tl_clear:N \l_tmpa_tl - \int_while_do:nNnn { \l__asmeconf_authorno_int } < { \g__asmeconf_authorcnt_int } { % starting with authorno = 0 ensures we reach authorcnt with +1 - \int_incr:N \l__asmeconf_authorno_int - \centering\vcoffin_gset:Nnn \g__asmeconf_authorblock_coffin { \dim_use:N \g__asmeconf_authorblockwidth_dim } { - \sffamily - \textbf{ \seq_item:Nn \g__asmeconf_author_seq { \l__asmeconf_authorno_int }} \\ - \int_set:Nn \l__asmeconf_authoraffilno_int { \seq_item:Nn \g__asmeconf_authoraffil_seq { \l__asmeconf_authorno_int } } - \tl_set:Nn \l_tmpa_tl { \seq_item:Nn \g__asmeconf_affiliation_seq { \l__asmeconf_authoraffilno_int } } - \tl_if_empty:NTF \l_tmpa_tl - { \msg_warning:nnV { \ClassName } { missingaffiliation } { \l__asmeconf_authorno_int } - }{ - \l_tmpa_tl - } - \par - } - \int_compare:nNnTF { \l__asmeconf_authorno_int } = { 1 } { - \coffin_gjoin:NnnNnnnn \g__asmeconf_firstrowauthorblock_coffin { r } { t } - \g__asmeconf_authorblock_coffin { l } { t } { 0pt} { 0pt } - } - { \int_compare:nNnTF { \l__asmeconf_authorno_int } = { 2 } { - \coffin_gjoin:NnnNnnnn \g__asmeconf_firstrowauthorblock_coffin { r } { t } - \g__asmeconf_authorblock_coffin { l } { t } { \dim_use:N \g__asmeconf_coffinsep_dim } { 0pt } - } - { \int_compare:nNnTF { \l__asmeconf_authorno_int } = { 3 } { - \coffin_gjoin:NnnNnnnn \g__asmeconf_firstrowauthorblock_coffin { r } { t } - \g__asmeconf_authorblock_coffin { l } { t } { \dim_use:N \g__asmeconf_coffinsep_dim } { 0pt } - } - { \int_compare:nNnTF { \l__asmeconf_authorno_int } = { 4 } { - \coffin_gjoin:NnnNnnnn \g__asmeconf_secondrowauthorblock_coffin { r } { t } - \g__asmeconf_authorblock_coffin { l } { t } { 0pt} { 0pt } - } - { \int_compare:nNnTF { \l__asmeconf_authorno_int } = { 5 } { - \coffin_gjoin:NnnNnnnn \g__asmeconf_secondrowauthorblock_coffin { r } { t } - \g__asmeconf_authorblock_coffin { l } { t } { \dim_use:N \g__asmeconf_coffinsep_dim } { 0pt } - } - { \int_compare:nNnTF { \l__asmeconf_authorno_int } = { 6 } { - \coffin_gjoin:NnnNnnnn \g__asmeconf_secondrowauthorblock_coffin { r } { t } - \g__asmeconf_authorblock_coffin { l } { t } { \dim_use:N \g__asmeconf_coffinsep_dim } { 0pt } - } - { \int_compare:nNnTF { \l__asmeconf_authorno_int } = { 7 } { - \coffin_gjoin:NnnNnnnn \g__asmeconf_thirdrowauthorblock_coffin { r } { t } - \g__asmeconf_authorblock_coffin { l } { t } { 0pt} { 0pt } - } - { \int_compare:nNnTF { \l__asmeconf_authorno_int } = { 8 } { - \coffin_gjoin:NnnNnnnn \g__asmeconf_thirdrowauthorblock_coffin { r } { t } - \g__asmeconf_authorblock_coffin { l } { t } { \dim_use:N \g__asmeconf_coffinsep_dim } { 0pt } - } - { \int_compare:nNnTF { \l__asmeconf_authorno_int } = { 9 } { - \coffin_gjoin:NnnNnnnn \g__asmeconf_thirdrowauthorblock_coffin { r } { t } - \g__asmeconf_authorblock_coffin { l } { t } { \dim_use:N \g__asmeconf_coffinsep_dim } { 0pt } - } - { \int_compare:nNnTF { \l__asmeconf_authorno_int } = { 10 } { - \coffin_gjoin:NnnNnnnn \g__asmeconf_fourthrowauthorblock_coffin { r } { t } - \g__asmeconf_authorblock_coffin { l } { t } { 0pt} { 0pt } - } - { \int_compare:nNnTF { \l__asmeconf_authorno_int } = { 11 } { - \coffin_gjoin:NnnNnnnn \g__asmeconf_fourthrowauthorblock_coffin { r } { t } - \g__asmeconf_authorblock_coffin { l } { t } { \dim_use:N \g__asmeconf_coffinsep_dim } { 0pt } - } - { \int_compare:nNnTF { \l__asmeconf_authorno_int } = { 12 } { - \coffin_gjoin:NnnNnnnn \g__asmeconf_fourthrowauthorblock_coffin { r } { t } - \g__asmeconf_authorblock_coffin { l } { t } { \dim_use:N \g__asmeconf_coffinsep_dim } { 0pt } - } - { \int_compare:nNnTF { \l__asmeconf_authorno_int } = { 13 } { - \coffin_gjoin:NnnNnnnn \g__asmeconf_fifthrowauthorblock_coffin { r } { t } - \g__asmeconf_authorblock_coffin { l } { t } { 0pt} { 0pt } - } - { \int_compare:nNnTF { \l__asmeconf_authorno_int } = { 14 } { - \coffin_gjoin:NnnNnnnn \g__asmeconf_fifthrowauthorblock_coffin { r } { t } - \g__asmeconf_authorblock_coffin { l } { t } { \dim_use:N \g__asmeconf_coffinsep_dim } { 0pt } - } - { \int_compare:nNnT { \l__asmeconf_authorno_int } = { 15 } { - \coffin_gjoin:NnnNnnnn \g__asmeconf_fifthrowauthorblock_coffin { r } { t } - \g__asmeconf_authorblock_coffin { l } { t } { \dim_use:N \g__asmeconf_coffinsep_dim } { 0pt } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - } - \int_compare:nNnT { \l__asmeconf_authorno_int } > { 15 } { - \msg_error:nn { \ClassName } { toomanyforgrid } - } - }% end loop - } - \msg_new:nnnn { \ClassName } { missingaffiliation } { Missing~affiliation~for~author~no.~#1! } {#1} - \msg_new:nnnn { \ClassName } { toomanyforgrid } { The~class~is~programmed~for~a~maximum~of~15~author~blocks.} - { For~authors~at~the~same~institution,\ you~may~put~more~than~one~name~above~a~single~address.\ - Else~use~the~in-line~author~style,\ not~the~[grid]~option.} - - % backward compatibility - \cs_if_exist:NF \tl_set:Ne { \cs_generate_variant:Nn \tl_set:Nn {Ne} } - - \cs_new:Nn \__asmeconf_constructauthorblock: { - \int_compare:nNnT { \g__asmeconf_authorcnt_int } > { 3 } { - \coffin_gjoin:NnnNnnnn \g__asmeconf_firstrowauthorblock_coffin { hc } { b } \g__asmeconf_secondrowauthorblock_coffin { hc } { t } { 0pt } { -1.5\baselineskip } - } - \int_compare:nNnT { \g__asmeconf_authorcnt_int } > { 6 } { - \coffin_gjoin:NnnNnnnn \g__asmeconf_firstrowauthorblock_coffin { hc } { b } \g__asmeconf_thirdrowauthorblock_coffin { hc } { t } { 0pt } { -1.5\baselineskip } - } - \int_compare:nNnT { \g__asmeconf_authorcnt_int } > { 9 } { - \coffin_gjoin:NnnNnnnn \g__asmeconf_firstrowauthorblock_coffin { hc } { b } \g__asmeconf_fourthrowauthorblock_coffin { hc } { t } { 0pt } { -1.5\baselineskip } - } - \int_compare:nNnT { \g__asmeconf_authorcnt_int } > { 12 } { - \coffin_gjoin:NnnNnnnn \g__asmeconf_firstrowauthorblock_coffin { hc } { b } \g__asmeconf_fifthrowauthorblock_coffin { hc } { t } { 0pt } { -1.5\baselineskip } - } - \coffin_typeset:Nnnnn \g__asmeconf_firstrowauthorblock_coffin { l }{ t }{ 0pt }{ 0pt } - \__asmeconf_gset_concataut: - \cs_gset:Npn \@author { \tl_use:N \g_asmeconf_authors_tl } - } - - % backward compatibility - \cs_if_exist:NF \seq_item:NV { \cs_generate_variant:Nn \seq_item:Nn {NV} } - - % build comma-separated list of author names - \tl_new:N \g_asmeconf_authors_tl - \tl_gset:NV \g_asmeconf_authors_tl \c_empty_tl - \cs_new_protected:Nn \__asmeconf_gset_concataut: { - \int_set:Nn \l_tmpa_int {1} - \tl_clear:N \l_tmpb_tl - \int_do_until:nNnn { \l_tmpa_int } > { \g__asmeconf_authorcnt_int } - { - \tl_set:Ne \l_tmpb_tl { \seq_item:NV \g__asmeconf_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 } - \tl_remove_all:Nn \l_tmpb_tl { \JointFirstAuthor } - \tl_replace_all:Nnn \l_tmpb_tl { \CorrespondingAuthor } { \use_none:n } - \int_compare:nNnT { \l_tmpa_int } < { \g__asmeconf_authorcnt_int } { - \tl_put_right:Nn \l_tmpb_tl { ,~ } - } - \tl_gput_right:NV \g_asmeconf_authors_tl \l_tmpb_tl - \int_incr:N \l_tmpa_int - } - %\iow_term:e { Authors:~ \tl_use:N \g_asmeconf_authors_tl } % diagnostic only - } - \ExplSyntaxOff - -%%% otherwise use the new compact layout of authors -\else - %%%%%%%%%%%%%%%%%%%%%% Inline author layout %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - %% - %% converted to expl3, 17 August 2024; revised 27 January 2025 - - \ExplSyntaxOn - \coffin_new:N \g__asmeconf_authorblock_coffin - \coffin_new:N \g__asmeconf_affiliationblock_coffin - \coffin_new:N \g__asmeconf_affiliationsblock_coffin - - \cs_if_exist:NF \cs_gset:Npe { \cs_generate_variant:Nn \cs_gset:Npn {Npe} } % needed through 2023 - \tl_new:N \g_asmeconf_formattedauthors_tl - \NewDocumentCommand\SetAuthors{m}{ - \tl_gset:Nn \g_asmeconf_formattedauthors_tl - { - \centering\sffamily\bfseries #1 - } - \__asmeconf_gset_stripauttokens:n {#1} - \cs_gset:Npe \@author { \tl_use:N \g_asmeconf_authors_tl } % set \@author = list of authors, 2024/07/31 - } - - %% strip \affil{..}, \JointFirstAuthor, \CorrespondingAuthor{...} from argument - \cs_new_protected:Nn \__asmeconf_gset_stripauttokens:n { - \tl_set:Nn \l_tmpa_tl {#1} - \regex_replace_all:nnN { \cA\~ } {\ } \l_tmpa_tl % replace ~ by space in author list - \tl_remove_all:Nn \l_tmpa_tl { \JointFirstAuthor } - \tl_replace_all:Nnn \l_tmpa_tl { \affil } { \use_none:n } - \tl_replace_all:Nnn \l_tmpa_tl { \CorrespondingAuthor } { \use_none:n } - \tl_new:N \g_asmeconf_authors_tl - \tl_gset:NV \g_asmeconf_authors_tl \l_tmpa_tl - % \iow_term:e { \tl_use:N \g_asmeconf_authors_tl }% diagnostic only - } - - \cs_gset:Npn \@makefnmark { \hbox{ \@textsuperscript{ \sffamily\@thefnmark } } } - - \seq_gclear_new:N \g__asmeconf_affiliations_seq - \NewDocumentCommand\SetAffiliation{mm}{ - \tl_if_blank:nTF {#1} - { - \seq_gput_right:Nn \g__asmeconf_affiliations_seq { \centering\sffamily \tl_trim_spaces:n{ #2 } }% - }{ - \seq_gput_right:Nn \g__asmeconf_affiliations_seq { \centering\NoHyper\footnotemark[#1]\endNoHyper\sffamily\tl_trim_spaces:n{ #2 } }% - } - } - - %%% Affiliation mark - \msg_new:nnn { \ClassName } { missingaffilno } { Missing~number~in~an~\affil~tag! } - \NewDocumentCommand{\affil}{>{\TrimSpaces} m}{ - \tl_if_blank:nTF {#1} - { - \msg_warning:nn { \ClassName } { missingaffilno } - \use_none:n % addresses modification for commas - }{ - \kern0.5pt\bfseries\NoHyper\footnotemark[#1]\endNoHyper - } - } - - %%% to deal with sequential notes as, e.g., "1,*", or "1,2,*" %%%%%%%%%% - \cs_new:Npn \__asmeconf_OtherNoteComma:n { - \peek_remove_spaces:n { % added 2025/01/27 - \peek_meaning:NTF \affil - { \textsuperscript{\mdseries,} } - { \peek_meaning:NTF \CorrespondingAuthor - { \textsuperscript{\mdseries,} } - { \peek_meaning:NT \JointFirstAuthor { \textsuperscript{\mdseries,} } } - } - } - } - \cs_new_eq:NN \__asmeconf_saveAF: \affil - \cs_gset_protected:Npn \affil #1 { \__asmeconf_saveAF: {#1} \__asmeconf_OtherNoteComma:n } - \cs_new_eq:NN \__asmeconf_saveCA: \CorrespondingAuthor - \cs_gset_protected:Npn \CorrespondingAuthor #1 { \__asmeconf_saveCA: {#1} \__asmeconf_OtherNoteComma:n } - \cs_new_eq:NN \__asmeconf_saveJA: \JointFirstAuthor - \cs_gset_protected:Npn \JointFirstAuthor { \__asmeconf_saveJA: \__asmeconf_OtherNoteComma:n } - - %%% - %% next construct author/affiliation coffin - \int_zero_new:N \g_asmeconf_count_affil_int - \cs_new:Nn \__asmeconf_constructauthorblock: { - \leavevmode - \tagpdfparaOff % this pair of tagpdf macros may change over time, 2025/01/28 -% \vcoffin_gset:Nnn \g__asmeconf_authorblock_coffin {\textwidth} % switched to vcoffin to accommodate tagging, 2024/10/16 -% { \tl_use:N \g_asmeconf_formattedauthors_tl } - \seq_remove_duplicates:N \g__asmeconf_affiliations_seq - \int_gset:Nn \g_asmeconf_count_affil_int {\seq_count:N \g__asmeconf_affiliations_seq} - \int_zero_new:N \l__asmeconf_affilno_int - \int_until_do:nNnn { \l__asmeconf_affilno_int } > { \g_asmeconf_count_affil_int } { - \vcoffin_set:Nnn \g__asmeconf_affiliationblock_coffin { \textwidth } { - \seq_item:Nn \g__asmeconf_affiliations_seq { \l__asmeconf_affilno_int } - } - \coffin_gjoin:NnnNnnnn \g__asmeconf_affiliationsblock_coffin { hc } { b } \g__asmeconf_affiliationblock_coffin {hc } { t } { 0pt} { -1pt } - \int_incr:N \l__asmeconf_affilno_int - } -%% separate author from affiliation, 2025/11/04, for tagging/css purposes -% \coffin_gjoin:NnnNnnnn \g__asmeconf_authorblock_coffin { hc } { b } \g__asmeconf_affiliationsblock_coffin {hc } { t } { 0pt} { -\baselineskip } -% \coffin_typeset:Nnnnn \g__asmeconf_authorblock_coffin { l }{ T }{ 0pt }{ 0pt } - \coffin_typeset:Nnnnn \g__asmeconf_affiliationsblock_coffin { l }{ T }{ 0pt }{ 0pt } - \tagpdfparaOn\par - } - \ExplSyntaxOff -\fi % end if...else for grid - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%% Make the title and author section -\ExplSyntaxOn - -\tagpdfsetup { role/new-tag = { Author_affiliation/Div } } -\tagpdfsetup { role/new-tag = { Affiliation/Div } } -\cs_new:Nn \__asmeconf_maketitlepage: { % 2025/03/11, removed \MakeTitlePage - \twocolumn[ - \__asmeconf_headertitle: - \__asmeconf_nbaseline_skip:n {2} - \ifasmeconf@grid - \par\tag_struct_begin:n { tag=Author_affiliation } - \__asmeconf_setauthorblock: - \__asmeconf_constructauthorblock: - \par\tag_struct_end: - \else - \parbox{ \linewidth }{ \centering \g_asmeconf_formattedauthors_tl }\par - \tag_struct_begin:n { tag=Affiliation } - \__asmeconf_constructauthorblock: - \tag_struct_end: - \fi - \__asmeconf_nbaseline_skip:n {3} - ] - \cs_gset_eq:NN \@makefnmark \savemakefnmark % restore footnote mark font - \cs_gset:Npn \thefootnote { \fnsymbol{footnote} } - \bool_if:NT \g__asmeconf_JA_bool { \footnotetext[2]{\JAwords} } - \bool_if:NT \g__asmeconf_CA_bool - { - \footnotetext[1]{\CAwords\g__asmeconf_CAsep_tl\g__asmeconf_CAemail_tl} - } - \cs_gset_eq:NN \thefootnote \savethefootnote % restore footnote symbol -} - - -%% Redefine titling commands from standard LaTeX article class -\RenewDocumentCommand{\maketitle}{}{ \__asmeconf_maketitlepage: } -\RenewDocumentCommand{\title}{m}{ \__asmeconf_gset_papertitle:n {#1} } - -\ExplSyntaxOff - -\RenewDocumentCommand{\thanks}{m}{\relax}% disabling this standard command (inconsistent with this format) - -%% \versionfootnote produces an unmarked footnote about the version date, to replace "date" -%% This tool is for editing and should not be used in the final draft - -%% This form provides working hyperlink, but it throws warning; also, \gdef -->\def. 2021/12/09 -%\NewDocumentCommand\versionfootnote{m}{\def\@thefnmark{}\@footnotetext{#1}} - -%% A hyperlink in this footnote will not function, since NoHyper is used to suppress 'missing anchor' warning -\NewDocumentCommand\versionfootnote{m}{\def\@thefnmark{}\begin{NoHyper}\@footnotetext{#1}\end{NoHyper}} - -\RenewDocumentCommand{\date}{m}{\versionfootnote{#1}}% if one wants to use \date this same way; fixed bug 2021/01/14 - - -%%%%%%%%%%%%%% THE REST OF THE CODE DEALS WITH FONTS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%%%%%%%%%%%% Sans serif upright greek and sans mathversion %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% revised 2025/03/23 -% -\ifac@fontspec - \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 - % -\else - %% 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.) Various edits 2021/01/25 - - \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}{b}{it}% added 2025/04/18 - \SetSymbolFont{lettersAB}{sansbold}{U}{ntxsfmia}{b}{it}% added 2021/01/25, to get this bold in captions, etc. - - \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 - - \DeclareMathAccent{\grave}{\mathord}{lettersAB}{254}% added these after bug report 2021/01/24 - \DeclareMathAccent{\acute}{\mathord}{lettersAB}{255} - \DeclareMathAccent{\check}{\mathord}{lettersAB}{186} - \DeclareMathAccent{\breve}{\mathord}{lettersAB}{187} - \DeclareMathAccent{\bar}{\mathord}{lettersAB}{221} - \DeclareMathAccent{\mathring}{\mathord}{lettersAB}{222} - \DeclareMathAccent{\hat}{\mathord}{lettersAB}{223} - \DeclareMathAccent{\dot}{\mathord}{lettersAB}{224} - \DeclareMathAccent{\tilde}{\mathord}{lettersAB}{219} - - %%% 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{lettersAB}{sans}{U}{ntxsfmia}{m}{it} - \IfFormatAtLeastTF{2016/01/05}{% - \SetSymbolFont{symbols}{sans}{LMS}{ntxsy}{m}{n} - }{\relax} - \SetSymbolFont{largesymbols}{sans}{LMX}{ntxexx}{m}{n} - \SetSymbolFont{largesymbolsTXA}{sans}{U}{ntxexa}{m}{n} - \SetSymbolFont{operators}{sans}{OT1}{\sfdefault}{m}{n}% fixed encoding 2025/04/07 - \SetMathAlphabet{\mathsf}{sans}{OT1}{\sfdefault}{m}{n}% make upright 2021/01/31. -\fi - -%%%%%%%%%%%%%%%%%% Times-like fonts for specific languages %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\ifpdftex - % Under lualatex, babel has problems with the following approach, which assumes that fontspec has not been loaded. - % Recommend not to choose the [nofontspec] option. - % These font options (vietnamese, greek, cyrillic) require LaTeX distributions 2020/02/02 or later. - % Several modifications made in response to newtx v1.71, 2022/03/14 - \ifac@vietnamese -% - \AtBeginDocument{% - \let\babel@aux\@gobbletwo % eliminate warnings about missing .fd. Brute force approach, revisit eventually. 2022/03/14 - \DeclareFontFamilySubstitution{T5}{\rmdefault}{qtm} % new in 02/20/2020 format of LaTeX! Need to test. - \DeclareFontFamilySubstitution{T5}{\ttdefault}{qcr} - } - % Vietnamese is in T5 encoding, can use Tex Gyre Termes font (qtm); - % qhv = Heros (helvetica). We get the right font w/o loading this. - % qcr = Cursor (monospaced) is poor match to inconsolata; qhv (the sf font) matches better, but isn't monospaced. -% - % From TeX Gyre Termes and Cursor .fd files by B. Jackowski and J. M. Nowacki, released under the GUST license - \begingroup - \nfss@catcodes -% - \def\qtm@scale{s*[0.97]} - \DeclareFontFamily{T5}{qtm}{}% not adjusting wordspacing - \DeclareFontShape{T5}{qtm}{b}{sc}{<-> \qtm@scale t5-qtmb-sc}{} - \DeclareFontShape{T5}{qtm}{b}{n}{<-> \qtm@scale t5-qtmb}{} - \DeclareFontShape{T5}{qtm}{b}{scit}{<-> \qtm@scale t5-qtmbi-sc}{} - \DeclareFontShape{T5}{qtm}{b}{it}{<-> \qtm@scale t5-qtmbi}{} - \DeclareFontShape{T5}{qtm}{m}{sc}{<-> \qtm@scale t5-qtmr-sc}{} - \DeclareFontShape{T5}{qtm}{m}{n}{<-> \qtm@scale t5-qtmr}{} - \DeclareFontShape{T5}{qtm}{m}{scit}{<-> \qtm@scale t5-qtmri-sc}{} - \DeclareFontShape{T5}{qtm}{m}{it}{<-> \qtm@scale t5-qtmri}{} - \DeclareFontShape{T5}{qtm}{bx}{sc}{<->ssub * qtm/b/sc}{} - \DeclareFontShape{T5}{qtm}{bx}{n}{<->ssub * qtm/b/n}{} - \DeclareFontShape{T5}{qtm}{bx}{scit}{<->ssub * qtm/b/scit}{} - \DeclareFontShape{T5}{qtm}{bx}{it}{<->ssub * qtm/b/it}{} - \DeclareFontShape{T5}{qtm}{b}{sl}{<->sub * qtm/b/it}{} - \DeclareFontShape{T5}{qtm}{m}{sl}{<->sub * qtm/m/it}{} - \DeclareFontShape{T5}{qtm}{b}{scsl}{<->sub * qtm/b/scit}{} - \DeclareFontShape{T5}{qtm}{m}{scsl}{<->sub * qtm/m/scit}{} -% - \def\qcr@scale{s*[0.95]} - \DeclareFontFamily{T5}{qcr}{}% not adjusting wordspacing - \DeclareFontShape{T5}{qcr}{b}{sc}{<-> \qcr@scale t5-qcrb-sc}{} - \DeclareFontShape{T5}{qcr}{b}{n}{<-> \qcr@scale t5-qcrb}{} - \DeclareFontShape{T5}{qcr}{b}{scit}{<-> \qcr@scale t5-qcrbi-sc}{} - \DeclareFontShape{T5}{qcr}{b}{it}{<-> \qcr@scale t5-qcrbi}{} - \DeclareFontShape{T5}{qcr}{m}{sc}{<-> \qcr@scale t5-qcrr-sc}{} - \DeclareFontShape{T5}{qcr}{m}{n}{<-> \qcr@scale t5-qcrr}{} - \DeclareFontShape{T5}{qcr}{m}{scit}{<-> \qcr@scale t5-qcrri-sc}{} - \DeclareFontShape{T5}{qcr}{m}{it}{<-> \qcr@scale t5-qcrri}{} - \DeclareFontShape{T5}{qcr}{bx}{sc}{<->ssub * qcr/b/sc}{} - \DeclareFontShape{T5}{qcr}{bx}{n}{<->ssub * qcr/b/n}{} - \DeclareFontShape{T5}{qcr}{bx}{scit}{<->ssub * qcr/b/scit}{} - \DeclareFontShape{T5}{qcr}{bx}{it}{<->ssub * qcr/b/it}{} - \DeclareFontShape{T5}{qcr}{b}{sl}{<->sub * qcr/b/it}{} - \DeclareFontShape{T5}{qcr}{m}{sl}{<->sub * qcr/m/it}{} - \DeclareFontShape{T5}{qcr}{b}{scsl}{<->sub * qcr/b/scit}{} - \DeclareFontShape{T5}{qcr}{m}{scsl}{<->sub * qcr/m/scit}{} - \endgroup - \fi -% - \ifac@greek -% - \AtBeginDocument{% - \let\babel@aux\@gobbletwo % eliminate warnings about missing .fd. Brute force approach, revisit eventually. 2022/03/14 - \DeclareFontFamilySubstitution{LGR}{\familydefault}{artemisia} % scale these - \DeclareFontFamilySubstitution{LGR}{\sfdefault}{maksf}% kerkis - \DeclareFontFamilySubstitution{LGR}{\ttdefault}{DejaVuSansMono-TLF} - } -% %% Based on Artemisia fd files by A. Tsolomitis and ideas from substitutefont package by G. Milde, both LaTeX Public License. - \begingroup - \nfss@catcodes -% - \def\artemisiasc@scaled{s*[0.95]} - \def\artemisia@scaled{s*[0.93]} - \DeclareFontFamily{LGR}{artemisia}{% - \fontdimen2\font=.25em - \fontdimen3\font=.2em - \fontdimen4\font=.1em - }% adjusted word spacing to match newtxtext... this is tighter. - \DeclareFontShape{LGR}{artemisia}{m}{n}{<-> \artemisia@scaled gartemisiarg6a}{} - \DeclareFontShape{LGR}{artemisia}{m}{it}{<-> \artemisia@scaled gartemisiai6a}{} - \DeclareFontShape{LGR}{artemisia}{b}{n}{<-> \artemisia@scaled gartemisiab6a}{} - \DeclareFontShape{LGR}{artemisia}{b}{it}{<-> \artemisia@scaled gartemisiabi6a}{} - \DeclareFontShape{LGR}{artemisia}{m}{sl}{<-> \artemisia@scaled gartemisiao6a}{} - \DeclareFontShape{LGR}{artemisia}{b}{sl}{<-> \artemisia@scaled gartemisiabo6a}{} - \DeclareFontShape{LGR}{artemisia}{m}{sc}{<-> \artemisiasc@scaled gartemisiasc6a}{} - \DeclareFontShape{LGR}{artemisia}{m}{sco}{<->\artemisiasc@scaled gartemisiasco6a}{} -% - %% nextx names oblique sc as both scit and scsl. ("largesc" option of newtx is different font, not a scaling.) - \DeclareFontShape{LGR}{artemisia}{m}{scsl}{<->\artemisiasc@scaled gartemisiasco6a}{}% sco - \DeclareFontShape{LGR}{artemisia}{m}{scit}{<->\artemisiasc@scaled gartemisiasco6a}{}% sco -% - \DeclareFontShape{LGR}{artemisia}{bx}{n}{<-> \artemisia@scaled gartemisiab6a}{} - \DeclareFontShape{LGR}{artemisia}{bx}{it}{<->\artemisia@scaled gartemisiabi6a}{} - \DeclareFontShape{LGR}{artemisia}{bx}{sl}{<->\artemisia@scaled gartemisiabo6a}{} -% -% % Sans Serif Greek font Kerkis -% % Based on Kerkis fd file, by Antonis Tsolomitis, under the LaTeX Project Public License - \def\kerkissf@scaled{s*[0.95]} - \DeclareFontFamily{LGR}{maksf}{}% not adjusting wordspacing - \DeclareFontShape{LGR}{maksf}{m}{n}{<-> \kerkissf@scaled gksf7t}{} - \DeclareFontShape{LGR}{maksf}{m}{it}{<->\kerkissf@scaled gksfi7t}{} - \DeclareFontShape{LGR}{maksf}{m}{sl}{<->\kerkissf@scaled gksfi7t}{} - \DeclareFontShape{LGR}{maksf}{m}{sc}{<->\kerkissf@scaled gksfsc7t}{} - \DeclareFontShape{LGR}{maksf}{b}{n}{ <->\kerkissf@scaled gksfb7t}{} - \DeclareFontShape{LGR}{maksf}{b}{it}{<->\kerkissf@scaled gksfbi7t}{} - \DeclareFontShape{LGR}{maksf}{b}{sl}{<->\kerkissf@scaled gksfbi7t}{} -% - \DeclareFontShape{LGR}{maksf}{bx}{n}{ <-> \kerkissf@scaled gksfb7t}{} - \DeclareFontShape{LGR}{maksf}{bx}{it}{ <-> \kerkissf@scaled gksfbi7t}{} - \DeclareFontShape{LGR}{maksf}{bx}{sl}{ <-> \kerkissf@scaled gksfbi7t}{} -% -% %% Greek monospaced font, DejaVuSansMono -% %% Based on DejaVu fd files by Pavel Farar, under the LaTeX Project Public License - \def\DejaVuSansMono@@scale{s*[0.85]}% - \DeclareFontFamily{LGR}{DejaVuSansMono-TLF}{}% not adjusting wordspacing - \DeclareFontShape{LGR}{DejaVuSansMono-TLF}{b}{it}{<-> \DejaVuSansMono@@scale DejaVuSansMono-BoldOblique-tlf-lgr}{} - \DeclareFontShape{LGR}{DejaVuSansMono-TLF}{b}{n}{ <-> \DejaVuSansMono@@scale DejaVuSansMono-Bold-tlf-lgr}{} - \DeclareFontShape{LGR}{DejaVuSansMono-TLF}{m}{it}{<-> \DejaVuSansMono@@scale DejaVuSansMono-Oblique-tlf-lgr}{} - \DeclareFontShape{LGR}{DejaVuSansMono-TLF}{m}{n}{ <-> \DejaVuSansMono@@scale DejaVuSansMono-tlf-lgr}{} - - \DeclareFontShape{LGR}{DejaVuSansMono-TLF}{m}{sl}{<-> \DejaVuSansMono@@scale DejaVuSansMono-TLF/m/it}{} - \DeclareFontShape{LGR}{DejaVuSansMono-TLF}{b}{sl}{<-> \DejaVuSansMono@@scale DejaVuSansMono-TLF/b/it}{} - - \DeclareFontShape{LGR}{DejaVuSansMono-TLF}{bx}{sl}{<->\DejaVuSansMono@@scale DejaVuSansMono-TLF/b/it}{} - \DeclareFontShape{LGR}{DejaVuSansMono-TLF}{bx}{it}{<->\DejaVuSansMono@@scale DejaVuSansMono-TLF/b/it}{} - \DeclareFontShape{LGR}{DejaVuSansMono-TLF}{bx}{n}{ <->\DejaVuSansMono@@scale DejaVuSansMono-TLF/b/n}{} -% - \endgroup - \fi - - \ifac@cyrillic -% - \AtBeginDocument{% - \let\babel@aux\@gobbletwo % eliminate warnings about missing .fd. Brute force approach, revisit eventually. 2022/03/14 - \DeclareFontFamilySubstitution{T2A}{\familydefault}{PTSerif-TLF} - \DeclareFontFamilySubstitution{T2A}{\sfdefault}{PTSans-TLF} -% \DeclareFontFamilySubstitution{T2A}{\ttdefault}{DejaVuSansMono-TLF} % if one prefers an SF monospace font - \DeclareFontFamilySubstitution{T2A}{\ttdefault}{PTMono} - } - %% Paratype fonts for cyrillic, maintained by Pavel Farar, under Latex Project Public License - \begingroup - \nfss@catcodes -% - \def\PTSerif@@scale{s*[0.95]}% had had 0.94... - \DeclareFontFamily{T2A}{PTSerif-TLF}{}% not adjusting wordspacing, since it matches newtxtext as is - \DeclareFontShape{T2A}{PTSerif-TLF}{m}{n}{ <->\PTSerif@@scale PTSerif-Regular-tlf-t2a}{} - \DeclareFontShape{T2A}{PTSerif-TLF}{m}{it}{<->\PTSerif@@scale PTSerif-Italic-tlf-t2a}{} - \DeclareFontShape{T2A}{PTSerif-TLF}{b}{n}{ <->\PTSerif@@scale PTSerif-Bold-tlf-t2a}{} - \DeclareFontShape{T2A}{PTSerif-TLF}{b}{it}{<->\PTSerif@@scale PTSerif-BoldItalic-tlf-t2a}{} - \DeclareFontShape{T2A}{PTSerif-TLF}{m}{ui}{<->\PTSerif@@scale PTSerif-UprightItalic-tlf-t2a}{} - \DeclareFontShape{T2A}{PTSerif-TLF}{m}{sl}{<->\PTSerif@@scale PTSerif-Slanted-tlf-t2a}{} - \DeclareFontShape{T2A}{PTSerif-TLF}{b}{ui}{<->\PTSerif@@scale PTSerif-BoldUprightItalic-tlf-t2a}{} - \DeclareFontShape{T2A}{PTSerif-TLF}{b}{sl}{<->\PTSerif@@scale PTSerif-BoldSlanted-tlf-t2a}{} -% - \DeclareFontShape{T2A}{PTSerif-TLF}{bx}{n}{<->ssub * PTSerif-TLF/b/n}{} - \DeclareFontShape{T2A}{PTSerif-TLF}{bx}{it}{<->ssub * PTSerif-TLF/b/it}{} - \DeclareFontShape{T2A}{PTSerif-TLF}{bx}{ui}{<->ssub * PTSerif-TLF/b/ui}{} - \DeclareFontShape{T2A}{PTSerif-TLF}{bx}{sl}{<->ssub * PTSerif-TLF/b/sl}{} -% - \def\PTSans@@scale{s*[0.94]}% - \DeclareFontFamily{T2A}{PTSans-TLF}{}% not adjusting wordspacing - \DeclareFontShape{T2A}{PTSans-TLF}{b}{it}{<->\PTSans@@scale PTSans-BoldItalic-tlf-t2a}{} - \DeclareFontShape{T2A}{PTSans-TLF}{b}{n}{<-> \PTSans@@scale PTSans-Bold-tlf-t2a}{} - \DeclareFontShape{T2A}{PTSans-TLF}{m}{it}{<->\PTSans@@scale PTSans-Italic-tlf-t2a}{} - \DeclareFontShape{T2A}{PTSans-TLF}{m}{n}{<-> \PTSans@@scale PTSans-Regular-tlf-t2a}{} - \DeclareFontShape{T2A}{PTSans-TLF}{c}{n}{<-> \PTSans@@scale PTSans-Narrow-tlf-t2a}{} - \DeclareFontShape{T2A}{PTSans-TLF}{bc}{n}{<->\PTSans@@scale PTSans-NarrowBold-tlf-t2a}{} -% - \DeclareFontShape{T2A}{PTSans-TLF}{m}{sl}{<->ssub * PTSans-TLF/m/it}{} - \DeclareFontShape{T2A}{PTSans-TLF}{b}{sl}{<->ssub * PTSans-TLF/b/it}{} - \DeclareFontShape{T2A}{PTSans-TLF}{bx}{sl}{<->ssub * PTSans-TLF/b/it}{} - \DeclareFontShape{T2A}{PTSans-TLF}{bx}{it}{<->ssub * PTSans-TLF/b/it}{} - \DeclareFontShape{T2A}{PTSans-TLF}{bx}{n}{<->ssub * PTSans-TLF/b/n}{} -% -% %% the tt cyrillic is slightly larger than the latin characters. - \def\PTMono@@scale{s*[0.92]}% - \DeclareFontFamily{T2A}{PTMono}{}% not adjusting wordspacing - \DeclareFontShape{T2A}{PTMono}{m}{n}{<-> \PTMono@@scale PTMono-Regular-tlf-t2a}{} - \DeclareFontShape{T2A}{PTMono}{b}{n}{<-> \PTMono@@scale PTMono-Bold-tlf-t2a}{} - \DeclareFontShape{T2A}{PTMono}{m}{sl}{<->\PTMono@@scale PTMono-Slanted-tlf-t2a}{} - \DeclareFontShape{T2A}{PTMono}{b}{sl}{<->\PTMono@@scale PTMono-BoldSlanted-tlf-t2a}{} - \DeclareFontShape{T2A}{PTMono}{m}{it}{<->\PTMono@@scale PTMono-Slanted-tlf-t2a}{} - \DeclareFontShape{T2A}{PTMono}{b}{it}{<->\PTMono@@scale PTMono-BoldSlanted-tlf-t2a}{} - - \DeclareFontShape{T2A}{PTMono}{bx}{n}{<->ssub * PTMono-TLF/b/n}{} - \DeclareFontShape{T2A}{PTMono}{bx}{sl}{<->ssub * PTMono-TLF/b/sl}{} -% - \def\DejaVuSansMono@@scale{s*[0.85]}% - \DeclareFontFamily{T2A}{DejaVuSansMono-TLF}{}% not adjusting wordspacing - \DeclareFontShape{T2A}{DejaVuSansMono-TLF}{b}{it}{<-> \DejaVuSansMono@@scale DejaVuSansMono-BoldOblique-tlf-t2a}{} - \DeclareFontShape{T2A}{DejaVuSansMono-TLF}{b}{n}{ <-> \DejaVuSansMono@@scale DejaVuSansMono-Bold-tlf-t2a}{} - \DeclareFontShape{T2A}{DejaVuSansMono-TLF}{m}{it}{<-> \DejaVuSansMono@@scale DejaVuSansMono-Oblique-tlf-t2a}{} - \DeclareFontShape{T2A}{DejaVuSansMono-TLF}{m}{n}{ <-> \DejaVuSansMono@@scale DejaVuSansMono-tlf-t2a}{} -% - \DeclareFontShape{T2A}{DejaVuSansMono-TLF}{m}{sl}{<-> \DejaVuSansMono@@scale DejaVuSansMono-TLF/m/it}{} - \DeclareFontShape{T2A}{DejaVuSansMono-TLF}{b}{sl}{<-> \DejaVuSansMono@@scale DejaVuSansMono-TLF/b/it}{} -% - \DeclareFontShape{T2A}{DejaVuSansMono-TLF}{bx}{sl}{<->\DejaVuSansMono@@scale DejaVuSansMono-TLF/b/it}{} - \DeclareFontShape{T2A}{DejaVuSansMono-TLF}{bx}{it}{<->\DejaVuSansMono@@scale DejaVuSansMono-TLF/b/it}{} - \DeclareFontShape{T2A}{DejaVuSansMono-TLF}{bx}{n}{ <->\DejaVuSansMono@@scale DejaVuSansMono-TLF/b/n}{} -% - \endgroup - \fi -\fi - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -\endinput -%% -%% End of file `asmeconf.cls'. - diff --git a/paper/asmeconf.bst b/paper/asmejour.bst similarity index 62% rename from paper/asmeconf.bst rename to paper/asmejour.bst index b9cadba..b93d9ba 100644 --- a/paper/asmeconf.bst +++ b/paper/asmejour.bst @@ -1,104 +1,127 @@ -%%%%% -%%%%% *** This .bst produces the reference format for ASME conference papers. *** -%%%%% *** Follows the examples given on ASME's conference web pages in early 2022. *** -%%%%% *** https://www.asme.org/publications-submissions/proceedings/author-guidelines/elements-of-a-paper/references *** -%%%%% *** The examples given by ASME do *not* cover all possibilities *** -%%%%% -%%%%% This file is version 1.17 dated 2025/11/02 -%%%%% -%%%%% Author: John H. Lienhard V -%%%%% Department of Mechanical Engineering -%%%%% Massachusetts Institute of Technology -%%%%% Cambridge, MA 02139-4307 USA -%%%%% -%%%%% The source files used are described below. The resultant bst has been edited to improve -%%%%% conformance to ASME specifications. Two new fields have been introduced for ASME -%%%%% conference papers: -%%%%% -%%%%% venue = {city of conference}, -%%%%% eventdate = {month, day[s] on which conference was held}, %% called confmonth in version 1.0 -%%%%% -%%%%% This approach leaves the address field as publisher's address, -%%%%% and it leaves the notes field open for other uses. -%%%%% -%%%%% Added fields: eventdate, urldate, urltype, venue -%%%%% Added: @online{...} for web publications (and aliased it to @www and @electronic) -%%%%% Added: urlprefix = {}, format.web.urldate, bbl.urldate; urltype field changes "accessed" to something else. -%%%%% Added: venue and eventdate to @inproceedings -%%%%% -%%%%% -%%%%% Edits in version 1.17, 2025/11/02 -%%%%% replace "\textit" by "\emph" in emphasis function -%%%%% -%%%%% Edits in version 1.16, 2024/02/03 -%%%%% fix spacing and punctuation in journal title macros -%%%%% -%%%%% Edits in version 1.15, 2022/12/30 -%%%%% Add macro "jhmt" for "ASME J. Heat Mass Transfer" -%%%%% -%%%%% Edits in version 1.14, 2022/09/13 -%%%%% Add code to format.journal.pages to deal with empty pages -%%%%% -%%%%% Edits in version 1.13, 2021/12/02 -%%%%% Switched remaining http:// prefixes to https:// -%%%%% Replace \href{}{} in \eprint by \url -%%%%% -%%%%% Edits in version 1.12, 2021/01/04: -%%%%% Added fields: version={}, format.version, to @book, @inbook, @online, @manual; -%%%%% versiontype = {}, with bbl.version, changes "Version" to other -%%%%% -%%%%% Edits in version 1.11, 2020/04/14: -%%%%% correct error in journal eid code. -%%%%% remove comma between Vol. and No. in article, per ASME style -%%%%% capitalize "Thesis", per ASME style -%%%%% insert "." after techreport number, per ASME style -%%%%% edits to @inbook, @proceedings, @incollection related to chapter and series. -%%%%% make punctuation after "(ed.)" consistent across entries. -%%%%% adjust block breaks in @online. -%%%%% allow for venue and eventdate in @proceedings -%%%%% add macros for ASME journal titles. add hdl as an equivalent to hndl archive macro. -%%%%% add numpages functionality for eid: "eid (numpages pages)" -%%%%% remove "doi" field from @online (since doi is a digital object identifier, not a web page). -%%%%% add "urldate" to eprint format, for optional use. -%%%%% warn in @online not to use both eprint and url, and warn if neither is given. -%%%%% remove series and add volume to @inproceedings. -%%%%% -%%%%% Feel free to edit this file to suit your own needs, but please make note of changes in this header. -%%%%% -%%========================================================= -%% LICENSE: -%% This file is a derivative work from the generated file, as envisioned by the LaTeX Project Public License. -%% -%% Copyright (c) 2020 John 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. -%% -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%% -%% This is file `asmeconf.bst', -%% generated with the docstrip utility. -%% -%% The original source files were: -%% -%% merlin.mbs (with options: `seq-no,nm-revf,ed-rev,jnrlst,dt-jnl,yr-par,xmth,yrp-col,tit-qq,atit-u,thtit-a,vnum-nr,volp-blk,jdt-pc,jwdpg,pp-last,jwdvol,num-xser,numser,jnm-x,pre-pub,doi,edparc,in-x,pp,ed,abr,ednx,ord,and-xcom,etal-xc,revdata,eprint,url,url-blk,em-it,nfss,') -%% ---------------------------------------- -%% *** This .bst produces the reference format for ASME conference papers. *** -%% -%% Copyright 1994-2011 Patrick W Daly -%% + %% + %% This is file `asmejour.bst', initially generated with the docstrip utility and extensively customized. + %% + %% *** This bibtex style follows ASME journals *** + %% + %% + %% This file is asmejour.bst, version 1.09 dated 2025/04/04. + %% + %% This file was generated and edited by John Lienhard. + %% This file is a derivative work under Clause 6 of the LPPL license. + %% + %% The generated file and the modifications are based on the formats that ASME is using in + %% published journal papers in early 2022. Details of the modifications follow. + %% + %% Created entry: @online{...} for web publications (and aliased it to @www and @electronic) + %% Created fields: eventdate, urldate, urltype, venue, fourth, fourthtype + %% Format for url: urlprefix = {}, format.web.urldate, bbl.urldate; urltype = {} changes "accessed" to other text. + %% Added fields: venue and eventdate to @inproceedings + %% Added field: version={}, format.version to @book, @online, @manual; versiontype = {} changes "Version" to other + %% Updated doi: doi url prefix updated to https://doi.org/ + %% + %% Remove "emphasize" from journal article, and linked doi (or else url) to journal name (or book title) + %% without explicitly showing the urls. The urls may be added to the note = {..} field to display explicitly + %% doilink fn is similar to tex.stackexchange.com/questions/76174/set-doi-link-on-journal-name-with-bibtex-bst + %% Modified fin.entry to omit period after a url, including a separate version for article and book which have + %% hyperlinks to titles. + %% + %% Capitalize: Vol., Chap., & No. + %% Remove "emphasize" before comma in format.bvolume, + %% @incollection: move chapter and edition, change format.in.ed.booktitle, modify format for "series" + %% + %% Modify \eprint to include full url, and provided some macros for archive={..} ... + %% ....this format is uncommon in ASME journals so implemented only as a url (but can easily patch if needed) + %% + %% Change format.note capitalizations from "l" to "t" and "u" to "t" respectively. + %% + %% Included macros for the titles of ASME's journals, following ASME formats (updated 4/10/20) + %% + %% + %% Modifications in v1.03 (2020/04/12) + %% + %% @article: add warning for empty pages; change ordering of numpages "pages" for eid + %% @book: reorder edition, version, and volume + %% @inbook: reorder edition, version, volume, etc.; hyperlink title to doi, url, or eprint + %% @incollection: create format.doi.booktitle to hyperlink title of collection to doi, url, or eprint. + %% @inproceedings: move venue, eventdate, and paper number toward end; warn that address should not be used with venue; + %% warn for empty venue and empty date; + %% create format.pvolume and format.in.ed.proctitle, to permit both [paper] number and volume + %% print either organization or publisher but not both + %% add bbl.paperno = "Paper No." and enable type ={} to change it (this is not backward compatible!) + %% hyperlink paper number to doi, or url, or eprint by default. + %% @inserialcollection: new entry type created to deal with citing articles in edited volumes that + %% come under different titles in a an ongoing series. This changes the placement + %% of Vol. number in the reference, putting series name and volume in ( ) after title. + %% This calls a new function format.in.ed.serialtitle. Hyperlink title of book. + %% For most uses, ordinary @incollection will be preferred. + %% This edit also reverts @incollection and @inproceedings to use Series, Vol. after eds, + %% which is consistent with many ASME references + %% @proceedings: edit order of fields; warn that address should not be used with venue; + %% print either organization or publisher but not both; + %% hyperlink title of proceedings to doi, url, or eprint; + %% provide format.alt.link to print the hyperlink if the report number is empty. + %% @techrep: move report number after address; hyperlink report number to doi, url, or eprint; + %% provide format.alt.link to print the hyperlink if the report number is empty. + %% provide institution.address function + %% + %% Modifications in v1.04 (2020/04/15) + %% add hdl macro as a synonym for hndl + %% separate format.serial.volume from format.bvolume; + %% arrange format.bvolume to order vol and series as ", Vol. X of Series Title", which affects + %% @book, @inbook, @incollection, and @proceedings. + %% + %% Modifications in v1.05 (2021/12/23) + %% convert remaining http:// prefixes to https:// + %% replace \href{}{} in \eprint by \url + %% provide \hrefurl for compatibility with LaTeX3 pdfmanagement + %% use \hrefurl in doilink, rather than \href + %% add macro text "jht" for "ASME J. Heat Transfer-Trans. ASME" + %% + %% Modifications in v1.06 (2022/12/30) + %% add macro text "jhmt" for "ASME J. Heat Mass Transfer" + %% + %% Modifications in v1.07 (2023/05/06) + %% correct code that provides \hrefurl + %% + %% Modifications in v1.08 (2024/02/03) + %% correct punctuation in journal macros + %% + %% Modifications in v1.09 (2025/04/04) + %% support chapter and page in @book + %% + %% Author: John H. Lienhard V + %% Department of Mechanical Engineering + %% Massachusetts Institute of Technology + %% Cambridge, MA 02139-4307 USA + %% + %======================================================================== + %% LICENSE: + %% + %% Copyright (c) 2020 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. + %% + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + %% + % The original source files for docstrip were: + % + % merlin.mbs (with options: `seq-no,nm-rev,jnrlst,dt-beg,xmth,tit-qq,atit-u,thtit-a,vol-bf,volp-com,jwdpg,pp-last,num-xser,numser,ser-vol,ser-ed,pre-edn,doi,edby,edbyy,blk-com,in-x,pp,ed,abr,ednx,ord,jabr,revdata,eprint,url,url-blk,eprint,url,url-nt,em-it,nfss,') + % ---------------------------------------- + % + % Copyright 1994-2011 Patrick W Daly % =============================================================== % IMPORTANT NOTICE: % This bibliographic style (bst) file has been generated from one or @@ -112,6 +135,9 @@ % Name and version information of the main mbs file: % \ProvidesFile{merlin.mbs}[2011/11/18 4.33 (PWD, AO, DPC)] % For use with BibTeX version 0.99a or later + % + % =============================================================== + %------------------------------------------------------------------- %------------------------------------------------------------------- % This bibliography style file is intended for texts in ENGLISH % This is a numerical citation style, and as such is standard LaTeX. @@ -157,9 +183,9 @@ ENTRY url urldate urltype - venue + venue version - versiontype + versiontype volume year } @@ -206,7 +232,28 @@ FUNCTION {output.check} 'output.nonnull if$ } + FUNCTION {fin.entry} +{ url empty$ + { eprint empty$ + { + add.period$ + write$ + newline$ + }{ + write$ + newline$ + } + if$ + }{ + write$ + newline$ + } + if$ +} + +%% For entries that hyperlink content +FUNCTION {fin.urllink.entry} { add.period$ write$ newline$ @@ -234,18 +281,7 @@ FUNCTION {add.blank} FUNCTION {date.block} { - ":" * - add.blank -} - -FUNCTION {conf.date.block} -{ pages empty$ -'skip$ - { - ":" * - add.blank - } - if$ + skip$ } FUNCTION {not} @@ -303,10 +339,17 @@ FUNCTION {field.or.null} 'skip$ if$ } + FUNCTION {emphasize} { duplicate$ empty$ { pop$ "" } - { "\emph{" swap$ * "}" * } + { "\textit{" swap$ * "}" * } + if$ +} +FUNCTION {bolden} +{ duplicate$ empty$ + { pop$ "" } + { "\textbf{" swap$ * "}" * } if$ } FUNCTION {tie.or.space.prefix} @@ -358,9 +401,6 @@ FUNCTION {bbl.nr} FUNCTION {bbl.in} { "in" } -FUNCTION {bbl.paperno} -{ "" } - FUNCTION {bbl.pages} { "pp." } @@ -374,13 +414,16 @@ FUNCTION {bbl.chapter} { "Chap." } FUNCTION {bbl.techrep} -{ "Technical Report" } +{ "Tech. Rep." } + +FUNCTION {bbl.paperno} +{ "Paper No." } FUNCTION {bbl.mthesis} -{ "Master's Thesis" } +{ "Master's thesis" } FUNCTION {bbl.phdthesis} -{ "Ph.D. Thesis" } +{ "Ph.D. thesis" } FUNCTION {bbl.first} { "1st" } @@ -410,7 +453,7 @@ FUNCTION {bbl.th} { "th" } FUNCTION {bbl.urldate} - { "Accessed" } + { "accessed" } FUNCTION {bbl.version} { "Version" } @@ -464,7 +507,7 @@ MACRO {arxiv} {"https://arxiv.org/abs/"} MACRO {googlebooks} {"https://books.google.com/books?id="} -MACRO {hdl} {"https://hdl.handle.net/"} +MACRO {hdl} {"https://hdl.handle.net/"} MACRO {hndl} {"https://hdl.handle.net/"} MACRO {jstor} {"https://www.jstor.org/stable/"} @@ -474,7 +517,7 @@ MACRO {oclc} {"https://www.worldcat.org/oclc/"} MACRO {pubmed} {"https://www.ncbi.nlm.nih.gov/pubmed/"} -MACRO {amr} {"Appl.\ Mech. Rev."} +MACRO {amr} {"Appl.\ Mech.\ Rev."} MACRO {lds} {"ASME Letters Dynamic Systems"} @@ -490,7 +533,7 @@ MACRO {jcnd} {"ASME J. Comput.\ Nonlin.\ Dyn."} MACRO {jcise} {"ASME J. Comput.\ Inf.\ Sci.\ Eng."} -MACRO {jds} {"J. Dyn. Syst.---T. ASME"} +MACRO {jds} {"J. Dyn.\ Syst.---T. ASME"} MACRO {jep} {"ASME J. Electron.\ Packag."} @@ -504,7 +547,7 @@ MACRO {jfe} {"ASME J. Fluids Eng."} MACRO {jfcst} {"ASME J. Fuel Cell Sci.\ Tech."} -MACRO {jht} {"ASME J. Heat Transfer"} +MACRO {jht} {"ASME J. Heat Transfer---Trans.\ ASME"} MACRO {jhmt} {"ASME J. Heat Mass Transfer"} @@ -535,46 +578,48 @@ MACRO {jtm} {"ASME J. Turbomach."} MACRO {jva} {"ASME J. Vib.\ Acoust."} -MACRO {acmcs} {"ACM Computing Surveys"} -MACRO {acta} {"Acta Informatica"} +MACRO {acmcs} {"ACM Comput.\ Surv."} -MACRO {cacm} {"Communications of the ACM"} +MACRO {acta} {"Acta Inf."} -MACRO {ibmjrd} {"IBM Journal of Research and Development"} +MACRO {cacm} {"Commun.\ ACM"} -MACRO {ibmsj} {"IBM Systems Journal"} +MACRO {ibmjrd} {"IBM J. Res.\ Dev."} -MACRO {ieeese} {"IEEE Transactions on Software Engineering"} +MACRO {ibmsj} {"IBM Syst.~J."} -MACRO {ieeetc} {"IEEE Transactions on Computers"} +MACRO {ieeese} {"IEEE Trans.\ Software Eng."} + +MACRO {ieeetc} {"IEEE Trans.\ Comput."} MACRO {ieeetcad} - {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} + {"IEEE Trans. Comput.\ Aid.\ Des."} -MACRO {ipl} {"Information Processing Letters"} +MACRO {ipl} {"Inf.\ Process.\ Lett."} -MACRO {jacm} {"Journal of the ACM"} +MACRO {jacm} {"J.~ACM"} -MACRO {jcss} {"Journal of Computer and System Sciences"} +MACRO {jcss} {"J.~Comput.\ Syst.\ Sci."} -MACRO {scp} {"Science of Computer Programming"} +MACRO {scp} {"Sci.\ Comput.\ Program."} -MACRO {sicomp} {"SIAM Journal on Computing"} +MACRO {sicomp} {"SIAM J. Comput."} -MACRO {tocs} {"ACM Transactions on Computer Systems"} +MACRO {tocs} {"ACM Trans.\ Comput.\ Syst."} -MACRO {tods} {"ACM Transactions on Database Systems"} +MACRO {tods} {"ACM Trans.\ Database Syst."} -MACRO {tog} {"ACM Transactions on Graphics"} +MACRO {tog} {"ACM Trans.\ Graphic."} -MACRO {toms} {"ACM Transactions on Mathematical Software"} +MACRO {toms} {"ACM Trans.\ Math.\ Software"} -MACRO {toois} {"ACM Transactions on Office Information Systems"} +MACRO {toois} {"ACM Trans.\ Office Inf.\ Syst."} -MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} +MACRO {toplas} {"ACM Trans.\ Progr.\ Lang.\ Syst."} + +MACRO {tcs} {"Theor.\ Comput.\ Sci."} -MACRO {tcs} {"Theoretical Computer Science"} FUNCTION {bibinfo.check} { swap$ duplicate$ missing$ @@ -611,25 +656,6 @@ FUNCTION {bibinfo.warn} } if$ } - -FUNCTION {format.web.urldate} -{ urldate empty$ - {""} - {urldate "urldate" bibinfo.check - urltype duplicate$ empty$ - { pop$ bbl.urldate } - 'skip$ - if$ - "urltype" bibinfo.check - swap$ duplicate$ empty$ - { pop$ "t" change.case$ } - { tie.or.space.prefix * * } - if$ - ", " * - } - if$ -} - FUNCTION {format.eprint} { eprint duplicate$ empty$ 'skip$ @@ -639,7 +665,6 @@ FUNCTION {format.eprint} { "[" * archive * "]" * } if$ "{" * swap$ * "}" * - format.web.urldate swap$ * } if$ } @@ -661,6 +686,24 @@ FUNCTION {format.version} if$ } +FUNCTION {format.web.urldate} +{ urldate empty$ + {""} + {urldate "urldate" bibinfo.check + urltype duplicate$ empty$ + { pop$ bbl.urldate } + 'skip$ + if$ + "urltype" bibinfo.check + swap$ duplicate$ empty$ + { pop$ "t" change.case$ } + { tie.or.space.prefix * * } + if$ + ", " * + } + if$ +} + FUNCTION {format.url} { url @@ -671,6 +714,7 @@ FUNCTION {format.url} } if$ } + INTEGERS { nameptr namesleft numnames } @@ -686,7 +730,7 @@ FUNCTION {format.names} numnames 'namesleft := { namesleft #0 > } { s nameptr - "{vv~}{ll}{, ff}{, jj}" + "{vv~}{ll}{, f.}{, jj}" format.name$ bibinfo bibinfo.check 't := @@ -699,6 +743,10 @@ FUNCTION {format.names} { 't := } { pop$ } if$ + numnames #2 > + { "," * } + 'skip$ + if$ t "others" = { " " * bbl.etal * @@ -721,7 +769,52 @@ FUNCTION {format.names} } FUNCTION {format.names.ed} { - format.names + 'bibinfo := + duplicate$ empty$ 'skip$ { + 's := + "" 't := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr + "{f.~}{vv~}{ll}{, jj}" + format.name$ + bibinfo bibinfo.check + 't := + nameptr #1 > + { + namesleft #1 > + { ", " * t * } + { + s nameptr "{ll}" format.name$ duplicate$ "others" = + { 't := } + { pop$ } + if$ + numnames #2 > + { "," * } + 'skip$ + if$ + t "others" = + { + + " " * bbl.etal * + } + { + bbl.and + space.word * t * + } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } if$ } FUNCTION {format.authors} { author "author" format.names @@ -740,23 +833,40 @@ FUNCTION {get.bbl.editor} FUNCTION {format.editors} { editor "editor" format.names duplicate$ empty$ 'skip$ { + "," * " " * get.bbl.editor - "(" swap$ * ")" * * } if$ } - FUNCTION {format.doi} { doi empty$ { "" } { - new.block "\doi{" doi * "}" * } if$ } +FUNCTION {doilink} +{ duplicate$ empty$ +{ pop$ "" } +{ doi empty$ + { url empty$ + { eprint empty$ + { skip$ } + { "\hrefurl{" archive eprint * * "}{" * swap$ * "}" * } + if$ + } + { "\hrefurl{" url * "}{" * swap$ * "}" * } + if$ + } + { "\hrefurl{https://doi.org/" doi * "}{" * swap$ * "}" * } + if$ +} +if$ +} + FUNCTION {format.note} { note empty$ @@ -766,7 +876,7 @@ FUNCTION {format.note} 'skip$ { output.state mid.sentence = { "t" } - { "u" } + { "t" } if$ change.case$ } @@ -775,17 +885,25 @@ FUNCTION {format.note} } if$ } - FUNCTION {format.title} -{ title +{ title "title" bibinfo.check duplicate$ empty$ 'skip$ { "\enquote{" swap$ * - add.period$ "}" * + non.stop + { ",} " * } + { "} " * } + if$ } if$ } +FUNCTION {end.quote.title} +{ title empty$ + 'skip$ + { before.all 'output.state := } + if$ +} FUNCTION {output.bibitem} { newline$ "\bibitem{" write$ @@ -844,45 +962,7 @@ FUNCTION {format.date} * } if$ - duplicate$ empty$ - 'skip$ - { - before.all 'output.state := - " (" swap$ * ")" * - } - if$ } -FUNCTION{format.year} -{ year "year" bibinfo.check duplicate$ empty$ - { "empty year in " cite$ * - warning$ - } - { - "(" swap$ * ")" * - } - if$ -} - -FUNCTION{format.thesis.year} -{ year "year" bibinfo.check duplicate$ empty$ - { "empty year in " cite$ * - warning$ - } - { - } - if$ -} - -FUNCTION{format.techrep.year} -{ year "year" bibinfo.check duplicate$ empty$ - { "empty year in " cite$ * - warning$ - } - { - } - if$ -} - FUNCTION {format.btitle} { title "title" bibinfo.check duplicate$ empty$ 'skip$ @@ -891,6 +971,14 @@ FUNCTION {format.btitle} } if$ } +FUNCTION {format.doi.btitle} +{ title "title" bibinfo.check + duplicate$ empty$ 'skip$ + { + doilink emphasize + } + if$ +} FUNCTION {either.or.check} { empty$ 'pop$ @@ -900,31 +988,41 @@ FUNCTION {either.or.check} FUNCTION {format.bvolume} { volume empty$ { "" } - { bbl.volume volume tie.or.space.prefix - "volume" bibinfo.check * * + { bbl.volume volume tie.or.space.prefix "volume" bibinfo.check * * series "series" bibinfo.check duplicate$ empty$ 'pop$ { swap$ bbl.of space.word * swap$ - emphasize * } + * } if$ "volume and number" number either.or.check } if$ } - -FUNCTION {format.paper.number} -{ number "number" bibinfo.check - type duplicate$ empty$ - { pop$ bbl.paperno } - 'skip$ - if$ - "type" bibinfo.check - swap$ duplicate$ empty$ - { pop$ "t" change.case$ } - { tie.or.space.prefix * * } +FUNCTION {format.pvolume} +{ volume empty$ + { "" } + { bbl.volume volume tie.or.space.prefix + "volume" bibinfo.check * * + series "series" bibinfo.check + duplicate$ empty$ 'pop$ + { ", " * swap$ *} + if$ + } + if$ +} +FUNCTION {format.serial.volume} +{ volume empty$ + { "" } + { bbl.volume volume tie.or.space.prefix + "volume" bibinfo.check * * + series "series" bibinfo.check + duplicate$ empty$ 'pop$ + { ", " * swap$ *} + if$ + "volume and number" number either.or.check + } if$ } - FUNCTION {format.number.series} { volume empty$ { number empty$ @@ -937,7 +1035,7 @@ FUNCTION {format.number.series} if$ number tie.or.space.prefix "number" bibinfo.check * * bbl.in space.word * - series emphasize "series" bibinfo.check * + series "series" bibinfo.check * } if$ } @@ -1049,22 +1147,16 @@ FUNCTION {format.pages} } if$ } - FUNCTION {format.journal.pages} { pages duplicate$ empty$ { "empty pages in " cite$ * warning$ } 'skip$ if$ - duplicate$ empty$ - { pop$ - " " * - format.year * - } + duplicate$ empty$ 'pop$ { swap$ duplicate$ empty$ - { pop$ pop$ format.pages } + { pop$ pop$ format.pages} { - " " * - format.year * ": " * + ", " * swap$ n.dashify pages multi.page.check @@ -1077,38 +1169,35 @@ FUNCTION {format.journal.pages} * } if$ - } + } if$ } FUNCTION {format.journal.eid} { eid "eid" bibinfo.check duplicate$ empty$ 'pop$ { swap$ duplicate$ empty$ 'skip$ - { - " " * - format.year * ": " * - swap$ - * - numpages empty$ 'skip$ - { numpages bbl.eidpp tie.or.space.prefix - "numpages" bibinfo.check * * - " (" swap$ * ")" * * - } - if$ + { + ", " * + } + if$ + swap$ * + numpages empty$ 'skip$ + { numpages bbl.eidpp tie.or.space.prefix + "numpages" bibinfo.check * * + " (" swap$ * ")" * * } if$ - } - if$ + } + if$ } FUNCTION {format.vol.num.pages} { volume field.or.null duplicate$ empty$ 'skip$ { - bbl.volume swap$ tie.or.space.prefix "volume" bibinfo.check - * * } if$ + bolden number "number" bibinfo.check duplicate$ empty$ 'skip$ { swap$ duplicate$ empty$ @@ -1116,14 +1205,14 @@ FUNCTION {format.vol.num.pages} 'skip$ if$ swap$ - " " bbl.nr * number tie.or.space.prefix pop$ * swap$ * + "(" swap$ * ")" * } if$ * } FUNCTION {format.chapter.pages} { chapter empty$ - 'format.pages + { "" } { type empty$ { bbl.chapter } { type "l" change.case$ @@ -1132,10 +1221,6 @@ FUNCTION {format.chapter.pages} if$ chapter tie.or.space.prefix "chapter" bibinfo.check - pages empty$ - 'skip$ - { ", " * format.pages * } - if$ * * } if$ @@ -1146,22 +1231,81 @@ FUNCTION {format.booktitle} booktitle "booktitle" bibinfo.check emphasize } +FUNCTION {format.doi.booktitle} +{ + booktitle "booktitle" bibinfo.check + doilink emphasize +} FUNCTION {format.in.ed.booktitle} -{ format.booktitle duplicate$ empty$ 'skip$ +{ format.doi.booktitle duplicate$ empty$ 'skip$ { + format.edition duplicate$ empty$ 'pop$ + { ", " swap$ * * } + if$ editor "editor" format.names.ed duplicate$ empty$ 'pop$ { - "" * - " " * get.bbl.editor - "(" swap$ * "). " * - * swap$ + swap$ "," * + " " * swap$ * + swap$ + "," * + " " * swap$ + * } + if$ + format.bvolume duplicate$ empty$ 'pop$ + { ", " swap$ * * } + if$ + word.in swap$ * + } + if$ +} +FUNCTION {format.in.ed.proctitle} +{ format.booktitle duplicate$ empty$ 'skip$ + { + format.edition duplicate$ empty$ 'pop$ + { ", " swap$ * * } + if$ + editor "editor" format.names.ed duplicate$ empty$ 'pop$ + { + get.bbl.editor + swap$ "," * + " " * swap$ * + swap$ + "," * + " " * swap$ + * } + if$ + format.pvolume duplicate$ empty$ 'pop$ + { ", " swap$ * * } + if$ + word.in swap$ * + } + if$ +} +FUNCTION {format.in.ed.serialtitle} +{ format.doi.booktitle duplicate$ empty$ 'skip$ + { + format.serial.volume duplicate$ empty$ 'pop$ + { " (" swap$ * * ")" *} + if$ + format.edition duplicate$ empty$ 'pop$ + { ", " swap$ * * } + if$ + editor "editor" format.names.ed duplicate$ empty$ 'pop$ + { + get.bbl.editor + swap$ "," * + " " * swap$ * + swap$ + "," * + " " * swap$ * } if$ word.in swap$ * } if$ } + FUNCTION {empty.misc.check} { author empty$ title empty$ howpublished empty$ month empty$ year empty$ note empty$ @@ -1178,10 +1322,37 @@ FUNCTION {format.thesis.type} } if$ } + +FUNCTION {format.alt.link} +{ doi empty$ + { url empty$ + { eprint empty$ + { format.note output + fin.urllink.entry + } + { format.note output + format.eprint output + fin.entry + } + if$ + } + { format.note output + format.url output + fin.entry + } + if$ + } + { format.doi output + format.note output + fin.urllink.entry + } + if$ +} + FUNCTION {format.tr.number} { number "number" bibinfo.check type duplicate$ empty$ - { pop$ bbl.techrep " " * bbl.nr * } + { pop$ bbl.techrep } 'skip$ if$ "type" bibinfo.check @@ -1189,7 +1360,45 @@ FUNCTION {format.tr.number} { pop$ "t" change.case$ } { tie.or.space.prefix * * } if$ + duplicate$ empty$ 'skip$ + { + doilink + } + if$ } + +FUNCTION {format.paper.number} +{ number "number" bibinfo.check + type duplicate$ empty$ + { pop$ bbl.paperno } + 'skip$ + if$ + "type" bibinfo.check + swap$ duplicate$ empty$ + { pop$ "t" change.case$ } + { tie.or.space.prefix * * } + if$ + duplicate$ empty$ 'skip$ + { + doilink + } + if$ +} +FUNCTION {format.venue} +{ venue "venue" bibinfo.check + duplicate$ empty$ 'skip$ + { + } + if$ +} +FUNCTION {format.eventdate} +{ eventdate "eventdate" bibinfo.check + duplicate$ empty$ 'skip$ + { + } + if$ +} + FUNCTION {format.article.crossref} { key duplicate$ empty$ @@ -1239,7 +1448,6 @@ FUNCTION {format.book.crossref} pop$ word.in } { bbl.volume - capitalize swap$ tie.or.space.prefix "volume" bibinfo.check * * bbl.of space.word * } if$ @@ -1309,19 +1517,23 @@ FUNCTION {format.organization.address} { organization "organization" bibinfo.check format.org.or.pub } +FUNCTION {format.institution.address} +{ institution "institution" bibinfo.check format.org.or.pub +} + FUNCTION {article} { output.bibitem format.authors "author" output.check - new.block + format.date "year" output.check + date.block format.title "title" output.check - new.block + end.quote.title crossref missing$ { journal "journal" bibinfo.check - emphasize + doilink "journal" output.check - add.blank format.vol.num.pages output } { format.article.crossref output.nonnull @@ -1330,14 +1542,9 @@ FUNCTION {article} eid empty$ { format.journal.pages } { format.journal.eid } - if$ - format.doi output - new.block - format.eprint output - format.url output - new.block + if$ format.note output - fin.entry + fin.urllink.entry } FUNCTION {book} @@ -1352,48 +1559,39 @@ FUNCTION {book} if$ } if$ - new.block - format.btitle "title" output.check - format.edition output - format.version output - new.block + format.date "year" output.check + date.block + format.doi.btitle "title" output.check crossref missing$ - { format.bvolume output - new.block - new.sentence + { format.edition output + format.version output + format.bvolume output format.number.series output format.publisher.address output } { - new.block format.book.crossref output.nonnull } if$ - format.date "year" output.check - format.doi output - new.block - format.eprint output - format.url output - new.block + format.chapter.pages output + format.pages output format.note output - fin.entry + fin.urllink.entry } FUNCTION {booklet} { output.bibitem format.authors output - new.block + format.date output + date.block format.title "title" output.check - new.block + end.quote.title howpublished "howpublished" bibinfo.check output address "address" bibinfo.check output - format.date output format.doi output - new.block + format.note output format.eprint output format.url output - new.block - format.note output fin.entry } @@ -1409,109 +1607,104 @@ FUNCTION {inbook} if$ } if$ - new.block - format.btitle "title" output.check - format.edition output - format.version output - new.block + format.date "year" output.check + date.block + format.doi.btitle "title" output.check crossref missing$ { + format.edition output + format.version output + format.bvolume output format.number.series output - format.number.series output - new.block - new.sentence format.publisher.address output - new.block - new.sentence + format.chapter.pages "chapter and pages" output.check } { - new.block + format.chapter.pages "chapter and pages" output.check format.book.crossref output.nonnull } if$ - format.date "year" output.check - date.block - format.chapter.pages "chapter and pages" output.check - new.block - format.doi output - new.block - format.eprint output - format.url output - new.block + format.pages "pages" output.check format.note output - fin.entry + fin.urllink.entry } FUNCTION {incollection} { output.bibitem format.authors "author" output.check - new.block + format.date "year" output.check + date.block format.title "title" output.check - new.block + end.quote.title crossref missing$ { format.in.ed.booktitle "booktitle" output.check - format.edition output - new.block format.number.series output - format.bvolume output - new.sentence format.publisher.address output + format.chapter.pages output } { format.incoll.inproc.crossref output.nonnull format.chapter.pages output } if$ - format.date "year" output.check - conf.date.block - format.chapter.pages "pages" output.check - format.doi output - new.block - format.eprint output - format.url output - new.block + format.pages "pages" output.check format.note output - fin.entry + fin.urllink.entry +} + +FUNCTION {inserialcollection} +{ output.bibitem + format.authors "author" output.check + format.date "year" output.check + date.block + format.title "title" output.check + end.quote.title + crossref missing$ + { format.in.ed.serialtitle "booktitle" output.check + format.number.series output + format.publisher.address output + format.chapter.pages output + } + { format.incoll.inproc.crossref output.nonnull + format.chapter.pages output + } + if$ + format.pages "pages" output.check + format.note output + fin.urllink.entry } FUNCTION {inproceedings} { output.bibitem format.authors "author" output.check - new.block + format.date "year" output.check + date.block format.title "title" output.check - new.block + end.quote.title crossref missing$ - { format.in.ed.booktitle "booktitle" output.check - volume empty$ 'skip$ - { bbl.volume volume tie.or.space.prefix - "volume" bibinfo.check * * output - } - if$ - new.sentence - format.paper.number output - conf.date.block - format.pages "pages" output.check - new.sentence - venue output - eventdate output - format.thesis.year "year" output.check - new.sentence + { format.in.ed.proctitle "booktitle" output.check publisher empty$ { format.organization.address output } - { organization "organization" bibinfo.check output - format.publisher.address output - } + { format.publisher.address output } if$ } { format.incoll.inproc.crossref output.nonnull } if$ - format.doi output - new.block - format.eprint output - format.url output - new.block - format.note output - fin.entry + venue empty$ + { venue "venue" output.check} + { "address and venue" address either.or.check format.venue output } + if$ + format.eventdate "eventdate" output.check + number empty$ + { format.pages "pages" output.check + format.alt.link + } + { format.paper.number "number" output.check + format.pages "pages" output.check + format.note output + fin.urllink.entry + } + if$ } FUNCTION {conference} { inproceedings } @@ -1527,71 +1720,60 @@ FUNCTION {manual} } { format.authors output.nonnull } if$ - new.block + format.date output + date.block format.btitle "title" output.check format.edition output format.version output - new.block author empty$ { organization empty$ { - address new.block.checka address "address" bibinfo.check output } 'skip$ if$ } { - organization address new.block.checkb organization "organization" bibinfo.check output address "address" bibinfo.check output } if$ - format.date output format.doi output - new.block + format.note output format.eprint output format.url output - new.block - format.note output fin.entry } FUNCTION {mastersthesis} { output.bibitem format.authors "author" output.check - new.block + format.date "year" output.check + date.block format.title "title" output.check - new.block + end.quote.title bbl.mthesis format.thesis.type output.nonnull school "school" bibinfo.warn output address "address" bibinfo.check output - new.block - format.thesis.year "year" output.check format.doi output - new.block + format.note output format.eprint output format.url output - new.block - format.note output fin.entry } FUNCTION {misc} { output.bibitem format.authors output - title howpublished new.block.checkb - format.title output - howpublished new.block.checka - howpublished "howpublished" bibinfo.check output format.date output + format.title output + end.quote.title + howpublished "howpublished" bibinfo.check output format.doi output - new.block + format.note output format.eprint output format.url output - new.block - format.note output fin.entry empty.misc.check } @@ -1608,54 +1790,38 @@ FUNCTION {online} if$ } if$ - new.block + format.date "year" output.check + date.block format.title "title" output.check - new.block + end.quote.title format.version output - new.block organization "organization" bibinfo.warn output address "address" bibinfo.check output - format.date "year" output.check - new.block - url empty$ - { eprint empty$ - { "missing url and eprint in" cite$ * warning$ } - { format.eprint output } - if$ - } - { "url and eprint" eprint either.or.check - format.url "url" bibinfo.warn output - } - if$ - new.block + format.doi output format.note output + format.eprint output + format.url "url" bibinfo.warn output fin.entry } - FUNCTION {electronic} { online } - FUNCTION {www} { online } - FUNCTION {phdthesis} { output.bibitem format.authors "author" output.check - new.block + format.date "year" output.check + date.block format.title "title" output.check - new.block + end.quote.title bbl.phdthesis format.thesis.type output.nonnull school "school" bibinfo.warn output address "address" bibinfo.check output - new.block - format.thesis.year "year" output.check format.doi output - new.block + format.note output format.eprint output format.url output - new.block - format.note output fin.entry } @@ -1664,21 +1830,16 @@ FUNCTION {proceedings} editor empty$ { organization "organization" bibinfo.check output } - { format.editors output.nonnull - } + { format.editors output.nonnull } if$ - new.block - format.btitle "title" output.check + format.date "year" output.check + date.block + format.doi.btitle "title" output.check format.bvolume output - new.block - venue "venue" output.check - eventdate "eventdate" output.check - new.block editor empty$ { publisher empty$ { format.number.series output } { - new.sentence format.number.series output format.publisher.address output } @@ -1686,62 +1847,50 @@ FUNCTION {proceedings} } { publisher empty$ { - new.sentence format.number.series output format.organization.address output } { - new.sentence format.number.series output - organization "organization" bibinfo.check output format.publisher.address output } if$ } if$ - format.date "year" output.check - format.doi output - new.block - format.eprint output - format.url output - new.block + "address and venue" address either.or.check format.venue "venue" output.check + format.eventdate "eventdate" output.check format.note output - fin.entry + fin.urllink.entry } FUNCTION {techreport} { output.bibitem format.authors "author" output.check - new.block + format.date "year" output.check + date.block format.title "title" output.check - new.block - format.tr.number output.nonnull - new.block - institution "institution" bibinfo.warn output - address "address" bibinfo.check output - new.block - format.techrep.year "year" output.check - format.doi output - new.block - format.eprint output - format.url output - new.block - format.note output - fin.entry + end.quote.title + format.institution.address output + number empty$ + { format.alt.link } + { format.tr.number output.nonnull + format.note output + fin.urllink.entry + } + if$ } FUNCTION {unpublished} { output.bibitem format.authors "author" output.check - new.block - format.title "title" output.check format.date output + date.block + format.title "title" output.check + end.quote.title format.doi output - new.block + format.note "note" output.check format.eprint output format.url output - new.block - format.note "note" output.check fin.entry } @@ -1777,15 +1926,17 @@ FUNCTION {begin.bib} write$ newline$ "\providecommand{\url}[1]{\texttt{#1}}" write$ newline$ - "\providecommand{\urlprefix}{URL }" + "\providecommand{\urlprefix}{}" write$ newline$ "\expandafter\ifx\csname urlstyle\endcsname\relax" write$ newline$ - " \providecommand{\doi}[1]{DOI \discretionary{}{}{}#1}\else" + " \providecommand{\doi}[1]{doi:\discretionary{}{}{}#1}\else" write$ newline$ - " \providecommand{\doi}{DOI \discretionary{}{}{}\begingroup \urlstyle{rm}\Url}\fi" + " \providecommand{\doi}{doi:\discretionary{}{}{}\begingroup \urlstyle{rm}\Url}\fi" write$ newline$ - "\providecommand{\eprint}[2][]{\urlprefix\url{#1#2}}" + "\providecommand{\eprint}[2][]{\urlprefix\url{#1#2}}" + write$ newline$ + "\providecommand{\hrefurl}[2]{\href{#1}{#2}}" write$ newline$ } EXECUTE {begin.bib} @@ -1798,4 +1949,4 @@ FUNCTION {end.bib} EXECUTE {end.bib} %% End of customized bst file %% -%% End of file `asmeconf.bst'. +%% End of file `asmejour.bst'. diff --git a/paper/asmejour.cls b/paper/asmejour.cls new file mode 100644 index 0000000..ace613b --- /dev/null +++ b/paper/asmejour.cls @@ -0,0 +1,1498 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% +%% 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'. +