尝试看了下模板源代码,结果头昏目眩了...
记录下探索发现
P.S.如果问题涉及多个需求建议分点阐述
有如下的发现:
关于问题4: 最软的柿子是 "注"...只是因为你在"注"字前多打了一个空格
关于问题3: MWE中采用的是enumerate
环境,在普通的文档类中要想简单地取消其缩进可以考虑 https://tex.stackexchange.com/questions/241983/remove-indent-when-using-enumerate 中的做法(虽然这样会去掉enumerate自动缩进的层次感并不推荐)
然而exam-zh
环境对\solution
环境进行了高度的自定义,这种做法并不能生效....代码逻辑有点看不动了...坐等肉丝老师(搓手手)
关于问题2:请查看exam-zh-doc
中关于index
选项的说明
关于问题1:我觉得也是不太好处理的...要适配不同长度的index
得改不少地方
对于不同宽度的序号的默认显示效果如下:
在exam-zh
中question/label-align
以及problem/label-align
的默认对齐方式均为right
,在exam-zh-question.sty
中:
\str_case:Vn \l__examzh_problem_label_align_tl
控制了problem
不同情况下item的缩进方式\str_case:Vn \l__examzh_question_label_align_tl
控制了question
下item的缩进方式\str_case:Vn \l__examzh_question_label_align_tl
以及\str_case:Vn \l__examzh_problem_label_align_tl
通过不同的弹性长度来调整标号的水平位置。....嗯...但我没改出来呜呜
在exam-zh-symbols.sty
中提供了\__examzh_symbols_frac_calc_str_num:nn
用于获取数位,结合不同分类情况也许可以实现...
听说 鱼香肉丝先生正是 exam-zh
的 maintainer,那就交给他好了.
还有一个小问题,如果需要输入(12分)
,请使用选项[points=12]
而不是直接输入。
公元2024年9月19号下午,华夏某LaTeX交流群出现了因建模比赛将近而GMCMthesis模板在overleaf上编译出现字体LiSu字体缺失的问题,引起激烈的讨论,下面就此问题进行记录(下面的问题将集中在隶书字体)。
首先介绍本地环境中在powershell
终端使用fc-list
命令可以获取本机当前为所有用户安装的字体列表,如下图所示(如果终端的字符编码不是utf-8
还可能需要通过借助chcp 65001
命令切换终端编码样式或者修改终端的字体来保证中文正常显示,我的设备还是会中文乱码,因此我也很苦恼...)
由于个人比较喜欢折腾,这里也贴出常见的几种fc-list
命令的附加命令(特别感谢Osbert Wang)感兴趣的朋友可以试试他们的使用效果。
# 以完整格式输出中文字体并在终端输出
fc-list :lang=zh-cn
# 以完整格式输出英文字体并保存在当前路径下的enfonts.txt文件中
fc-list :lang=en > enfonts.txt
# 只输出字族,达到使用\setmainfont的使用需求
fc-list :lang=zh-cn family
# 使用--format选项格式化输出fc-list的结果
fc-list :lang=zh --format="%{family[0]}\n" | sort
fc-list :lang=zh --format="%{family[0]},%{family[1]}\n"
# 使用功能更强的终端如powershell可以实现去重/排序等功能
fc-list :lang=zh --format="%{family[0]},%{family[1]}\n" | Sort-Object | Get-Unique | Out-File zhfont.txt -Encoding default
在这里还必须提到,对于已经安装的字体,TeX引擎会通过其字体族(font family)的名称来调用;而对于只提供字体文件(.otf
,.ttf
)的字体,TeX会优先搜索当前工作路径下的字体文件并进行调用,这样的好处是避免操作系统安装的字体过多过于复杂(具体的例子可见下图,特别感谢Eureka大神提供的开源仓库 All about TeX 走过路过可以点一个star)。
P.S. 我本人对字体的使用问题完全可以说是七窍通了六窍,在LaTeX(尤其是模板)的使用中字体的配置问题由于各种系统的差异以及版权问题往往是令人头疼的,此处仅提供在不同平台下编译效果的实际测试与经验汇总。
作为后文介绍的前置知识,我们还应该知道GMCMthesis
实际上调用的文档类是ctex
宏包提供的ctexart
文档类,其文档中对不同系统的字体调用情况说明如下图:
-------前面都是一些为了内容完整性的(废话)------这是一条分割线-----
本文将从使用四种测试环境,测试的代码使用从GMCMthesis-github拉取的example.tex
文件为准。
本地编译环境(windows11+TeXLive2024)
LiSu
字体的情况(比如一台刚刚装过windows11系统的干干净净的电脑)下,LiSu
这一字体是一点点小问题的(见下图,但是警告不是错误,可以忽略),但不影响使用xelatex
编译example.tex
顺利通过。LiSu
字体,也即使用fc-list :lang=zh | findstr "LiSu"
可以检索到隶书字体C:/Windows/fonts/SIMLI.TTF: LiSu,隶书:style=Regular
时,使用xelatex
编译example.tex
模板是完美编译的。xelatex
编译example.tex
文件的效果同windows11+TeXLive2024Fandol
字库)example.tex
文档首先说明如果需要在OverLeaf
上编译,则需要选择相应的字库选项如下:
% \documentclass[bwprint]{gmcmthesis}
\documentclass[bwprint,fontset=fandol]{gmcmthesis} % OverLeaf 等在线平台需要用这一行。
在如上图上传项目文档后,使用xelatex
编译example.tex
文件
首先需要指出的是,警告并不影响最终编译结果,在宏包heavenlyclouds
的作用下,由于ubuntu
系统不自带隶书,因此其策略自动选择用楷书代替并raise这个warning。
与此同时,比赛官方仅仅提供了一个word模板,并未有严格的格式规范,所以实际上并不一定非要使用隶书,建模比赛更重要的还是内容,分辨字体是否正确不是一个评审应该重点关注的事情,和本科生国赛一样,其实并没有格式要求,只需要排版整洁美观严谨就是一个好的文档样式。
既然鱼香肉丝老师发问了,这里记录下群里讨论出的解决方法:
感谢群友@u19850 可以在example.tex
同层文件目录下上传LiSu.ttf
文件,并且将.cls
中的代码修改如下:
% 将gmcmthesis.cls的 316行左右 处修改如下,处理字体兼容
\ifmcm@fandol
% \setCJKfamilyfont{zhli}{LiSu} % 需要隶书字体 最好更换其他相似字体
\setCJKfamilyfont{zhli}{LiSu.ttf}
\newcommand*\lishu{\CJKfamily{zhli}}
% \providecommand{\lishu}{\kaishu}
% \PackageWarning{heavenlyclouds}{用楷书代替隶书}
\fi
如此做,便可通过当前目录下字体.ttf
文件的直接调用解决找不到字体的问题。
由于一些版权的原因,此处无法提供LiSu.ttf
文件,请自行下载并上传到工作路径下。
TeXpage
实际上TeXpage的编译表现和Overleaf完全相同
在上传LiSu.ttf
并进行字体兼容后,在TeXpage使用xelatex
在TeXLive2024
下也可正常编译.
这个问题问得非常好,也是LaTeX交流群中最常见的(入门必读)的一个问题!
感谢肉丝老师的馈赠~
LaTeX
最快的入门手册是lshort-zh-cn
文档(强烈建议花至少111分钟熟悉该文档并亲自尝试(just get your hands dirty!))4LaTeX
有疑问的,请阅读OsbertWang精心编写(他真的我哭死,甚至在2024年9月又更新了一版)的install-latex-guide-zh-cn
文档,所有的TeXLive
安装问题都能在这里找到答案。反引号的输入可见下图(在英文状态下输入):
Happy TeXing!
OsbertWang指出,并不是所有字体的宏包均包含了对应的字体,有部分仅仅是提供了调用字体的接口。
因此 https://ask.latexstudio.net/ask/question/3298.html 中的做法是合理的。
另一方面,mathdesign
宏包的文档还提到容易发生宏包冲突
做一个简单的总结,2024年9月测试,windows系统下如果要调用garamond
数学字体,大致有以下三种可行的方案
unicode-math
提供的\setmainfont
调用\usepackage{unicode-math}
\setmathfont{Garamond-Math}
newtxmath
宏包提供的garamond选项\usepackage[ebgaramond]{newtxmath}
Garamond-Math
宏包文档提供的方法\usepackage[math-style=ISO, bold-style=ISO]{unicode-math}
\setmainfont{EB Garamond}%You should have installed the font
\setmathfont{Garamond-Math.otf}[StylisticSet={7,9}]
Welcome to LaTeX Studio!
上面的代码只需要使用xelatex
引擎编译即可,同时可以尝试使用\documentclass{ctexart}
替代article
,而是直接调用ctex
宏包提供的文档类,这样就不用显式写出对xeCJK
的调用了。
我不是很懂MikTeX和TeXWorks,但是根据我配置vscode中compile recipes的理解,你的如图配置等价于:
每次使用名为xelatex+shell-escape
的编译选项,将自动在命令行使用
texify.exe --pdf --engine=xetex --syntex=1 --clean --tex-option=--shell-escape <your filename>
按照我对命令行粗浅的理解,应该是 <program.exe> <options(通常以--或-开头)> <filename>
的一般格式,我感觉你上面的--tex-option=--shell-escape
不是很对... 或许可以试试--shell-escape
,同时我也不太确定miktex是不是可以直接选用texify.exe
命令...
在TeXLive2024下要使用xelatex -shell-escape
可以如下配置,也许你可以参考一下试试
"name": "xelatex-shell-escape",
"command": "xelatex",
"args": [
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"-shell-escape",
"%DOCFILE%"
]
上面的name
,command
,args
理论上对应了你图中的选项...当然你也应该先探索在终端纯用命令行xelatex -shell-escape filename.tex
能否编译exam-zh,再去尝试配置TeXWorks中的编译选项.
以上,希望对你有帮助。
如何说明不起作用?也许只是你没看出来区别
不指定任何字体:
你的MWE:
你的MWE不规范.....需要保证复制即可直接编译复现你的问题
使用nicematrix
宏包可以优雅地解决
\documentclass{article}
\usepackage{amsmath}
\usepackage{nicematrix}
\begin{document}
\[
balabala=
\begin{pNiceMatrix}[first-row,last-col]
n_1&n_2 &\cdots &n_s & \\
A_{11} & A_{12} & \cdots & A_{1s} &m_1\\
A_{21} & A_{22} & \cdots & A_{2s} &m_2\\
\vdots & \vdots & \ddots & \vdots &\vdots\\
A_{r1} & A_{r2} & \cdots & A_{rs} &m_r\\
\end{pNiceMatrix}
\]
\end{document}
你对需求的描述不够清楚,最好结合图片说明你的具体需求。
已经对原回答做了修改,实现效果和修改方式可见下面的两张图。
顺便给一个mwemmwe.zip
PS.你的MWE里面的正文部分还是存在一些和本问题无关的内容,下次请尽量删除以减少回答者的代码阅读量
PPS.不要再看CSDN的内容了,你上面的链接只能在他的那种情况下解决你的问题,当你位于你获得的这个模板的处理方式下,往往不奏效。也希望不要以碰运气搜一搜改对就万岁的思路来学习latex,多耐心看看文档。
如果不在文档类中的话,也许可以尝试用ifthen
宏包提供的多条件判断功能
%\usepackage{ifthen}
\def\A{123}
\def\B{1234}
\def\C{1234}
\def\D{12}
\ifthenelse{\(\equal{5}{6}\) \or \(\equal{123}{\A} \and \equal{\D}{1234}\) }{Yes!}{No!}
你好,请提供最小(Minimal)工作示例。
上面的代码明显有较多无关代码,且包含.bib
文件,并无法保证别人复制后直接可运行。
同时,请使用markdown的围栏代码块语法;并善用预览功能,你的代码缺少转义符号\',另建议对于不方便透露的文字,请使用
lipsum或
zhlipsum`宏包填充假文。
对STIX数学字体不太了解,但这个很有特色的小写z应该是来源于newtx
的小写字母.我进行了如下测试
\usepackage{newtx}
$$
f(z) = \log z + \exp{(z^2-3z+2)}
$$
\usepackage{unicode-math}
%\setmathfont{XITS Math}%选其一
\setmathfont{STIX Math}
$$
f(z) = \log z + \exp{(z^2-3z+2)}
$$
最后另附上常用数学字体 from lshort
提问请务必提供出现上述情况的完整代码。
进行了一下尝试,使用zotero7导出包含上述文献的.bib文件后,并没有复现出你的问题.如有问题,请提供MWE(最小工作示例)包含多个文件,请务必上传.zip
等压缩包文件。
\documentclass{ctexart}
\usepackage{lipsum,zhlipsum}
\bibliographystyle{abbrv}
\begin{document}
\lipsum[1]
我能吞下玻璃\cite{rigatos_nonlinear_2023}而不伤害身体\cite{ogulmus_development_2023}。
\lipsum[2-3]
\bibliography{reference}
\end{document}
参考文献页面表现正常
下面是我的MWE文件.
tmp-mwe.zip
fragile command
)与健壮(robust command
)命令该问题可谓是tse
上最常被访问的问题之一,可见链接macros - What is the difference between Fragile and Robust commands? When and why do we need protect? - TeX - LaTeX Stack Exchange本部分的内容将总结自该回答。一个宏被处理的顺序是读入、展开(expand)、执行(execute)、输出。下面是定义:
脆弱命令(Fragile Command)指的是在被展开时行为不正常,而在被执行时可以正常实现的命令。“A fragile command is one that does not behave properly when expanded, but not executed.”与之相对的,健壮命令(Robust Command)是指在展开和执行时均可以正常实现的命令。
这样的脆弱命令要正确执行,需要保证【在下一个token被展开之前】,某些命令被正确地执行,而健壮命令不需要这点。这样的命令只能在 normal(interleaved)mode
中正确执行,而在只进行展开而不执行expansion-only contexts
的某些情况下将导致错误。
“But in certain circumstances, most notably when writing to a file, TeX only expands things without executing them (the result will most probably be (re-expanded and) executed later when TeX reads the file back)”在某些情况下(例如执行tableofcontents
时),TeX
将只展开而不执行宏,此后将其写入辅助文件.toc
后再次读入,以便生成正确的目录。因此下面可以使用\section
并通过观察对比.toc
文件来区分。
关于展开与执行的一些细节比较:
Expansion v.s. Execution
input stream
),意味着将改变TeX
引擎下一步将读取到什么内容TeX
引擎将对读取到的内容进行剩下的操作
\input
是可以展开的,TeX
将会插入其他文件的内容
\def
和\kern
命令由于均为TeX
的原语(primitive),属于不可进一步展开的宏**\show \def > \def=\def. **\show \kern > \kern=\kern.
脆弱命令为什么会报错?这里直接借助回答里提供的例子来说明
\newcommand\foo[1]{\def\arg{#1}\ifx\arg\empty T\else F\fi}
%定义一个单参数命令`\foo`,当传入参数为空时返回`T`,否则返回`F`
在正常的文本模式(normal context)中,\foo{} => T
而\foo{stuff} => F
;在执行过程中TeX
读入\def
并尝试将其展开,发现其不可展开之后,将执行\def
,这时TeX
吞入并移除了作为命令\def
参数的\arg{#1}
;进一步TeX
吞入了\ifx
命令,尝试展开后执行,执行的时候吞入并移除了其参数\arg\empty
,最终按照条件判断的逻辑输出结果T
或F
;
而在只进行展开的模式(expand-only context)中,相信我们已经知道会发生什么了,在吞入\def
并展开失败之后,并不会执行\def
吞入下一个token\arg
,此时\arg
可能并未被定义,然后TeX
将会raise an error msg
;如果宏\arg
已经被定义(例如\def\arg{\abc}
),那么在这种只展开的模式内,使用\foo{}
将会得到\def \abc{}
,这将重新定义宏\abc
,而这种操作远不是我们想实现的效果,脆弱命令在expand-only context并没有那么稳健。
\protect
命令的用法从一个Eureka
大神给出的例子出发,下面是一个体现fragile command
的例子
\documentclass[12pt]{article}
\newcommand{\testA}{testA}
\NewDocumentCommand{\testB}{}{testB}
\NewExpandableDocumentCommand{\testC}{}{testC}
\begin{document}
\tableofcontents
\section{\testA}
\section{\protect\testA}
\section{\testB}
\section{\testC}
\end{document}
输出的.toc
文件的结果形如:
\contentsline {section}{\numberline {1}testA}{1}{}%
\contentsline {section}{\numberline {2}\testA }{1}{}%
\contentsline {section}{\numberline {3}\testB }{1}{}%
\contentsline {section}{\numberline {4}testC}{1}{}%
上述使用\newcommand
命令定义的\testA
不是protected
宏,因此在\section
内部会被直接展开结果为testA
;而是用\protect
命令“保护”了\testA
后其不会被展开;使用NewDocumentCommand
定义的\testB
属于\protected
宏,因此不会被展开;而使用NewExpandableDocumentCommand
定义的\testC
与\newcommnd
的行为类似,均会在\section
内部这一expand-only context中被展开,最后一起输出到.toc
文件被二次读入后执行。在这种流程下,得到的\tableofcontents
命令读入展开(但不执行)后写入.toc
文件时是否展开上有所不同。
在LaTeX2e
的源码source2e.pdf
中\protect
宏的工作原理如下:
\protect
将会被展开至\relax
,意味着什么事也不做\protect
将意味着\noexpand
,该命令将阻止下一个token的展开,因此也就是保护了下一个命令命令,让其不被展开。这正好fix了脆弱命令在只进行展开模式下的脆弱性。本部分部分参考自链接macros - When to use edef, noexpand, and expandafter? - TeX - LaTeX Stack Exchange,关于命令定义部分参考自The TeXBook chap20
\expandafter<token>
:首先读取紧随其后的一个token,同时展开该token后的另一个token,同时将原先紧随其后的token添加到展开结果之前\noexpand<token>
:展开的结果为被展开的token本身,但该token如果是一个【按照TeX展开规则一般要被展开的命令】,则其含义此时等同于\relax
\csname<string>\endcsname
:将<string>
转换为宏\<string>
,如果宏\<string>
未被定义,则默认定义为\relax
\string<token>
:将token转换为字符记号本身\def
:\def<cs><parameter text>{<replacement text>}
意为将控制序列定义为<replacement text>
的内容;\gdef
等同于命令\global\def
,这使得命令在编组外可用\edef
:\edef<cs><parameter text>{<replacement text>}
意为在定义\cs
时先完全地展开<replacement text>
再将其作为控制系列\cs
的定义;\xdef
等同于\global\edef
\expanded
是pdftex、xetex、luatex、uptex 等引入的,knuth tex、etex中都没有,其定义如下:
而查阅 The TeXBook中可以知道\message
命令的定义如下(不需要双写##
参数符号):
\message
的行为与\edef
类似, 完全展开所有参数后输出到终端, 唯一的区别是内部参数不需要双写(double)\expanded
的行为与\message
类似,这也与下文中e
型展开不需要双写一脉相承下面学习一下上面链接中有关展开的小例子
\def\examplea{more stuff}
\def\exampleb{Some stuff First \expandafter\noexpand\csname examplea\endcsname}
\edef\examplec{Some stuff Second \expandafter\noexpand\csname examplea\endcsname}
\examplea %=> more stuff
\exampleb %=> Some stuff First
\examplec %=> Some stuff Second more stuff
%(使用\edef在定义时即展开了\expandafter,此时\noexpand组织了\expandafter的展开,最终保留了\relax\examplea)
在LaTeX3
中,关于展开有以下不同的参数类型(由于我对expl3
的也不熟悉,在这里浅浅搬运并翻译一下interface3.pdf
中关于展开参数的几种类型的介绍):
c
型展开,意为csname
,是一种完全展开,是N
的变体(要求传入参数为一个token),类似于\csname<cmd string>\endcsname
,该命令将会对其内的字符串内容构建作为命令名称后展开,常用于拼接命令字符串,或通过传入命令的字符串形式而直接使用该命令o
型展开,与n
类似,会读入一个token list
的内容,但对其中的内容只进行一次展开x
(exhaustive expansion
,一展到底
),同样地读入一个token list
的内容,并将每一个参数递归地展开直至遇到不可展开的参数类型为止;与Plain-TeX
的原语(primitive
)中的命令\edef
有相同的行为。当函数的参数带有x
型参数时,该函数是不可展开的(not expandable)e
型展开,e
型展开在大多数情况下的行为与x
型展开完全相同,但与此对应的是TeX
原语中的\expanded
命令。参数变量(通常是#
)在被使用时不需要双写(doubled)。当函数使用e
型参数时,该函数可能是可以展开的(expandable
)f
(full expansion
),f
和x
型展开类似,均会对参数的宏进行递归展开,但会在展开至(遇到)第一个不可展开的 token 时停止。当传入的token list包含空格(space token)时,空格将会被吞下(gobble),并立刻停止,后面的内容保持不变,此后的其他空格也不会被移除。V
与v
型参数意为变量的值(value of variable),该参数用于获取变量的内容而不用担心数据内在的TeX 结构。V
型参数对应N
类型,要求传入一个token
(例如\foo:V \MyVariable
); 而v
型参数对应n
类型,要求传入一个token list
(例如\foo:v {MyVariable}
)【关于expl3
的问题点: V
型展开和其他类型的展开的区别是什么,何时需要使用V
型展开,何时需要使用x/e/f
型展开】\write
,\csname \endcsname
,以及\expandafter
等命令均只会进行展开而不会执行
LaTeX3
中关于f
型展开/e
型展开均不会进行执行操作,赋值操作也均不会生效
NewExpandableDocumentCommand
的例子关于构造的问题,首先感谢一下交流群友Eureka
给出的下面的例子:
\documentclass[border=6pt]{standalone}
\usepackage{tikz}
\NewDocumentCommand\testA{m}{#1}
\NewExpandableDocumentCommand\testB{m}{#1}
\newcommand{\testC}[1]{#1}
\begin{document}
\begin{tikzpicture}
%\draw[\testA{orange}] (0,0)--(1,1); % fails
\draw[\testB{magenta}] (0,0)--(1,1); % works
\draw[\testC{cyan}] (0,0)--(1,0); % works
\end{tikzpicture}
\end{document}
% Thanks Eureka!
由于在tikz
的node
命令选项(option)中的参数默认不会被展开,因此需要使用NewExpandableDocumentCommand
才可正常使用(也可以直接使用\newcommand
).
.toc
测试展开方式的差异测试代码和效果如下
\documentclass[12pt]{article}
\newcommand\foo{April Fool!}
\NewDocumentCommand{\barr}{}{\foo\ Ahahaha!}
\NewDocumentCommand{\foobar}{}{\foo\ Ahaha! \barr}
\NewExpandableDocumentCommand{\expbarr}{}{\foo\ Ahaha!}
\NewExpandableDocumentCommand{\expfoobar}{}{\foo\ Ahaha! \barr}
\begin{document}
\tableofcontents
\section{\foo}
\section{\barr}
\section{\foobar}
\section{\expbarr}
\section{\expfoobar}
\end{document}
按照上面的回答,在正常的上下文中,读入、展开、执行、输出这四个将依次交替执行。上述代码在生成初次编译生成.toc
文件写入时执行的是e
型展开【问题点:哪里的文档对此有介绍咧(?)】,而由于NewDocumentCommand
定义是的protected
宏,并不会被e
型展开展开,因此从结果来看,命令\barr
和\foobar
均不会被展开;而对于NewExpandableDocumentCommand
定义的命令,由于其定义的宏不是protected
宏,在写入.toc
文件时执行e
型展开则会被完全替换为宏的定义文本<replacement text>
,这种替换也被称为“完全展开”。、
e
型展开与\int
和\flag
对比下面尝试使用latex3
来构造例子,可见下面的文件
待补充,希望路过的各位uu不吝赐教批评指正(😭😭😭)
还挖了好多坑的,我还是一个个开新的提问尝试一下能否解决,会把新的问题移到这里的
\section
中使用\verb
以及宏包fancyvrb
提供的\Verb
报错的原因…..protected
宏和robust
宏这一trick的实现,\protect
与\protected
的区别,以及cprotect
宏包用法expl3
中f
型展开与e
型展开吞空格的差异….interface3
中提到的fully expandable functions
与restricted expandable functions
的区别与例
问 参考文献为什么不显示?