myhsia
myhsia
PhD Student in Cond-Matt Physics at Westlake University

注册于 3年前

回答
19
文章
1
关注者
2

这只是简单的例子,正常情况下还有其他的东西
你可以看 install-LaTeX-guide-zh-cn 仓库的 build.lua (是的,也是我写的),但是那个因为我和啸行老师的习惯不同,所以一些过于 "超前" 的功能我没加进去,你可以看下我的 litetable 包的 build.lua

https://github.com/myhsia/litetable/blob/main/build.lua

这个包情况复杂:dtx 文件是纯英文写的,那么 latexmk -pdf 编译;但是还有普通话和粤语手册,自然要用 xe. 这个包是个很好的例子,你可以看下他的 build.lua.
同时这个包还提供了 demo 文件,并且还要保证 demo 文件先被 typeset 并丢到 ./buiild/doc 里从而三语言文档会用 pdfpages 的 \includepdf 去插入 demo ...
同时,还有 tag 功能,一键修改 dtx 文件里的日期和版本号...
还有上传 CTAN 功能,输入CTAN包管理员个人信息等
所以略微复杂,但是我觉得你如果能学完这个包的 l3build,你就基本上能在 l3build 横着走了,接下来你就要去官方 GitHub repo去看源代码,从而指导如果想实现一些自定义功能要改什么函数

Hello~ l3build 重度使用者来咯~

给你简单写了个最基础的 build.lua,你执行 l3build doc 即可顺利编译
(注意到你加载了一些 Windows 特色字体,由于我是 macOS,所以注释了这些行,用 fandol 字体代替)

完整的 build.lua 在末尾,我现在给你一行行解释

module              = "hello"

这行表示声明你这个项目的名称,也就是包名字,这个变量会被 l3build 内部很多函数调用.

ctanzip             = module

这个表示上传CTAN打包时的压缩包名称,那么 module 定义为 hello,那么最后压缩文件名为 hello.zip

cleanfiles          = {"*.log", "*.pdf", "*.zip", "*.curlopt"}

l3build 存在一个选项 clean,这个就是打包 上传等过程中会生成的缓存文件,执行 l3build clean 会清理掉

excludefiles        = {"*~"}

这个嘛...就是不包含的文件,意思是打包上传 CTAN 时不会被塞入压缩包,原来的值是

excludefiles = {"*~","build.lua","config-*.lua"} 

但是我把后面俩去掉了——我有个习惯,就是把打包文件也上传 CTAN,这个是被 CTAN 允许的

textfiles           = {"*.md", "LICENSE", "*.lua"}

这个就是很没用的那种纯文本文档,但是能够起声明版权等作用,最后会被包含到 zip 里.
上一行我说我想把 build.lua 塞进去,那我就在这里用了个 dirty trick.

typesetexe          = "latexmk -xelatex"

嗯 很明显这行是排版的程序,其实官方手册并不允许这样做,你使用 latexmk 会报错,但是我在 build.lua 末尾做了些手段 :-),我就想用 latexmk(傲娇)

typesetruns         = 1

那么既然我们用 latexmk,运行一次就够啦(l3build 足足运行了 3回啊3回!!!)

好啦!完整文件如下,并附上完成 build 的结果
image.png

module              = "hello"

ctanzip             = module
cleanfiles          = {"*.log", "*.pdf", "*.zip", "*.curlopt"}
excludefiles        = {"*~"}
textfiles           = {"*.md", "LICENSE", "*.lua"}
typesetdemofiles    = {module .. "-demo.tex"}
typesetexe          = "latexmk -xelatex"
typesetruns         = 1

--[== "Hacks" to `l3build` | Do not Modify ==]--

function docinit_hook()
  cp(ctanreadme, unpackdir, currentdir)
  return 0
end
function tex(file,dir,cmd)
  dir = dir or "."
  cmd = cmd or typesetexe
  if os.getenv("WINDIR") ~= nil or os.getenv("COMSPEC") ~= nil then
    upretex_aux = "-usepretex=\"" .. typesetcmds .. "\""
    makeidx_aux = "-e \"$makeindex=q/makeindex -s " .. indexstyle .. " %O %S/\""
    sandbox_aux = "set \"TEXINPUTS=../unpacked;%TEXINPUTS%;\" &&"
  else
    upretex_aux = "-usepretex=\'" .. typesetcmds .. "\'"
    makeidx_aux = "-e \'$makeindex=q/makeindex -s " .. indexstyle .. " %O %S/\'"
    sandbox_aux = "TEXINPUTS=\"../unpacked:$(kpsewhich -var-value=TEXINPUTS):\""
  end
  return run(dir, sandbox_aux .. " " .. cmd         .. " " ..
                  upretex_aux .. " " .. makeidx_aux .. " " .. file)
end

其实后边 hack 也很简单:

function docinit_hook()
  cp(ctanreadme, unpackdir, currentdir)
  return 0
end

钩子,见过没?LaTeX里也有 \AddToHook 😋
l3build 提供了钩子 docinit_hook()l3build ctan 的过程分大概三部:unpack (就是抽离 sty), typeset (编译手册), 和 tar (压缩包);那么 docinit_hook() 就发生在 typeset 前,或者说 unpack 后,因为我喜欢把譬如 README.md 打包到 dtx 里,但是它又需要在GitHub首页展示,所以我一旦更改 README,我会在 dtx 里改,然后这样每次 build 时就会覆盖掉当前仓库根目录下的 README. cp 命令的用法是 cp(文件, 源路径, 新路径). unpackdir 就是每次执行 l3build unpack 等命令后目录出现的 ./build/unpacked, currentdir 就是仓库的根目录.

这段有点小难... 也是我想很久写出来的, 就是强制 latexmk
这里相当于重新定义 l3build 里原有的 tex 函数了,吃仨参数:文件,路径,命令

function tex(file,dir,cmd)

如果 dir 被定义了,那么这里临时变量 dir 就是等于被定义的 dir 的值;否则就是根目录;cmd 也同样

  dir = dir or "."
  cmd = cmd or typesetexe

Windows 系统的黑锅(发怒)

  if os.getenv("WINDIR") ~= nil or os.getenv("COMSPEC") ~= nil then

如果是Windows系统,那么有几个地方就是双引号

    upretex_aux = "-usepretex=\"" .. typesetcmds .. "\""
    makeidx_aux = "-e \"$makeindex=q/makeindex -s " .. indexstyle .. " %O %S/\""
    sandbox_aux = "set \"TEXINPUTS=../unpacked;%TEXINPUTS%;\" &&"
  else

否则就是单引号,记得转译斜杠(这个跟 l3build 无关,不会的恶补下 Linux)

好了,介绍下这些分别是啥,请打开 latexmk 手册

  • upretex_aux: 比如哈,你的项目里有 hook (最简单的:隐藏答案!) 你希望不改变文件比如 \documentclass[hideanswer] 这种窝囊的方式,那么可以在编译时加料, 例如你可以 latexmk -usepretex='\\AtBeginDocument\\DisableImplementation' (这是 l3doc 里的例子,注意 \\ 转译),那么这时你可以在前面定义 typesetcmds 这个变量,实现加料,此时 upretex_aux 这个临时变量被定义为 -usepretex=\'\\AtBeginDocument\\DisableImplementation\'.
    upretex_aux = "-usepretex=\'" .. typesetcmds .. "\'"

众所周知,bib 参考文献有 bst 格式文件,那么索引同样. 逆天 l3doc 偏要使用 gind.ist 索引文件,所以 latexmk 也有设置索引文件style的接口,剩下的 makeidx_auxupretex_aux 同理,自己对着 latexmk 手册慢慢看吧... 对了 makeidx_auxupretex_aux 这俩变量名是我瞎写的,只要后面调用时一致即可.

    makeidx_aux = "-e \'$makeindex=q/makeindex -s " .. indexstyle .. " %O %S/\'"

沙河机制,是的,你会发现每次 unpack 后 .sty 都跑到了 ./build/unpacked 里,而 ./build/doc 里却没有,这是因为 l3build 官方也采用了沙河机制,默认情况下比如 latexmk 也好,或者单独 pdflatex 也好,都会优先检索当前文件夹,然后在检索系统 texmf(貌似是?反正就是你 tlmgr update 后包安装的位置), 那么这个路径是可以改(往上叠加的,把 ./build/unpack 也给他加进去!)

    sandbox_aux = "TEXINPUTS=\"../unpacked:$(kpsewhich -var-value=TEXINPUTS):\""
  end

好了,这几个临时变量定义完了,接下来开始调用他们!
这个函数返回什么呢?run 是官方的一个借口(你可以理解为元语吧),在 argument dir (回忆:函数定义为 function tex(file, dir, cmd),这个 dir 就好比 #2)下,然后向命令行输出这些内容,这些内容已经被定义好.

  return run(dir, sandbox_aux .. " " .. cmd         .. " " ..
                  upretex_aux .. " " .. makeidx_aux .. " " .. file)
end

hook 很容易的,无论你使用 2e 提供的也好还是 3 提供的也好:

\hook_gput_code:nnn {<hook>} {<label>} {<commands>}

没必要重新定义几个标题命令.

Hope this may help u: using l3bool

image.png

\documentclass[AutoFakeBold, oneside,a4paper,12pt]{ctexbook}

\makeatletter
\ExplSyntaxOn
\bool_new:N \l_@@_chapter_afterskip_bool
\hook_gput_code:nnn { cmd / chapter / before } {.}
  { \bool_gset_true:N \l_@@_chapter_afterskip_bool }
\hook_gput_code:nnn { cmd / @startsection / before } {.}
  { \bool_if:NT \l_@@_chapter_afterskip_bool { \vskip -2em } }
% 使用 vskip: 否则 chapter 后紧挨着的正文结尾、和接下来第一个 section 标题
% 之间距离会变小甚至重叠
\DeclareDocumentCommand \banchapterskip {}
  { \bool_gset_false:N \l_@@_chapter_afterskip_bool }
\ExplSyntaxOff
\makeatother

\ctexset{
  secnumdepth = 3,
  chapter = {
    name        = {}, break       = ,
    number      = \arabic{chapter},
    format+     = \zihao{-2}\heiti,
    aftername   = \,\,\,,
    beforeskip  = -1.5em,
    afterskip   = 3.3em
  },
  section = {
    format      = \zihao{4}\heiti,
    nameformat+ = \zihao{4}\heiti,
    aftername   = \,\,\,,
    titleformat = \zihao{4}\heiti,
    beforeskip  = 0.3em,
    afterskip   = 0.1em,
    aftertitle+ = \banchapterskip
  },
  subsection = {
    format      = \zihao{-4}\heiti,
    nameformat+ = \zihao{-4}\heiti,
    aftername   = \,\,\,,
    titleformat = \zihao{-4}\heiti,
    beforeskip  = 0em,
    afterskip   = 0.62em
  },
  subsubsection = {
    format      = \zihao{-4}\heiti,
    nameformat+ = \zihao{-4}\heiti,
    aftername   = \,\,\,,
    titleformat = \zihao{-4}\heiti,
    beforeskip  = 0ex,
    afterskip   = 0ex
  }
}

\begin{document}

\chapter{这是章标题这是章标题这是章标题}
\section{SECTION-SECTION-SECTION-SECTION}
\subsection{SUBSECTION-SUBSECTION-SUBSECTION-SUBSECTION}
\subsubsection{SUBSUBSECTION-SUBSUBSECTION-SUBSECTION-SUBSECTION}

\vspace{3em}

\chapter{这是章标题这是章标题这是章标题}
正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文
\section{SECTION-SECTION-SECTION-SECTION}
正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文
\subsection{SUBSECTION-SUBSECTION-SUBSECTION-SUBSECTION}
正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文
\subsubsection{SUBSUBSECTION-SUBSUBSECTION-SUBSECTION-SUBSECTION}
正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文正文
\end{document}

补充一句:这种图专业称为 量子线路(Quantum Circuit),其实有更加专业的宏包处理这种图,见 TSE 上的回答

具体实操本人暂不做了,因为电脑最近送修了 :-)

我曾在 GitHub 工作流测试我开发的模板时遇到相同的报错,经检查这是因为你的 Windows 系统中并未在可选功能中安装简体中文字体包
我曾遇到的错误如下:
image.png
报错

这是因为系统中并不存在相应的字体,可能是在安装 Windows 时选择外区导致的
(毕竟,GitHub 工作流安装 Windows 肯定选用外区,才不会额外安装简中字体包)

SJTUTHESIS 给出了解决方式
image.png

在系统设置 -> 可选功能中安装支撑字体即可

谢邀. 在这里主要介绍下查找思路:
首先编译你的这个 MWE,而后会生成一个 *.bbl 文件,这个是可以直观的查看最终 PDF 输出的内容的,发现里面:

\bibitem{满红2014CSTR}
满红.
CSTR过程的模型辨识及其非线性预测控制方法研究~[D].
[S.~l.]: 大连理工大学, 2014.

根据你的要求,那么我们检索 S.~l.,发现 *.bst 里 140 行

FUNCTION {bbl.sine.loco}   { language empty$ { "S.~l." } { "出版地不详" } if$ }

得知这个输出由函数 bbl.sine.loco 控制,那么我们就搜索这个函数,这时会在额外 5 处搜到(可能对应不同的 if 判断,实测只有第 1861 行有效)

1860 -- 1862 行原始如下:

address empty$
    {
      "[" bbl.sine.loco * "]" * bbl.colon * % 无出版地
      school empty$

很好理解,意思就是

"["           bbl.sine.loco * "]" *         bbl.colon
左方括号 S.~l.                  右方括号 冒号

刚好和你的截图对应. 这几行处理后如下

address empty$
    {
      % "[" bbl.sine.loco * "]" * bbl.colon * % 无出版地
      "" school empty$

注意到在注释掉这个function同时,还要在 school empty$ 前加 "",否则会报错(你理解为“助动词”好了)

不过其他基础我也给你改了,改好的 *.bst 见附件.

image.png

mystyle.bst

在给你保留原汁原味的情况下,给你通过编译了,下次提供 MWE 不要搞这么长

\documentclass[fontset = fandol]{ctexbook}
\usepackage{zhlipsum}
\usepackage{titletoc}
\usepackage{titlesec}
\usepackage{geometry}
\usepackage{xcolor}
\usepackage{pagecolor} 
\usepackage{layout}
\usepackage{chemfig,subcaption,graphicx,float}
\usepackage{listings}
\definecolor{background}{RGB}{215, 247, 250}
\definecolor{藏花红}{RGB}{236,45,122}
\definecolor{石绿}{RGB}{87,195,194}
\geometry{a4paper,centering,scale=0.9}
%自定义“目录名称”
\renewcommand{\contentsname}{\hfill\songti\bfseries\LARGE 文章目录 \hfill
}

\newfontfamily\codefont{Times New Roman}


\setcounter{chapter}{-1} % 初始化为-1,使第一个章节显示

\ctexset{
  chapter = {
    name = {\S},   % 将"第X章"改为"§ X"
    number = \arabic{chapter},    % 阿拉伯数字编号
    format = \songti\large\bfseries\centering, % 标题格式
    beforeskip = 2.5ex,          % 标题前间距
    afterskip = 2.5ex,           % 标题后间距
  }
}
%  针对章(chapter)的目录格式
\titlecontents{chapter}[0pt]                     % 作用对象:章
    {\songti\bfseries}        % 全局格式:间距+右对齐+粗体
    {\thecontentslabel} % 带编号格式
    {}                                           % 无编号格式(空)
    {\titlerule*[8pt]{.}\contentspage}           % 页码引导符+页码

\titleformat{\section}[frame]
{\color{藏花红}}
{\centering
\footnotesize
\enspace 节 \thesection\enspace}
{8pt}
{\bfseries\filcenter\songti}
[\vspace{-10pt}]


% 代码排版配置
% 自定义VBA语法高亮
\lstdefinelanguage{VBA}{
    morekeywords={Sub, End, Dim, As, Set, Range, Worksheet, MsgBox, 
        If, Then, Else, For, Next, Do, While, Loop, Integer, String},
    sensitive=true,
    morecomment=[l]{'},       % 单行注释
    morestring=[b]{"},        % 字符串定义
    keywordstyle=\codefont\color{blue},
    stringstyle=\codefont\color{red},
    basicstyle=\codefont\small,
    keepspaces=true,
    numbers=left,
    % 边距控制
    xleftmargin=2em,                     % 左边界距
    xrightmargin=2em,                     % 右边界距
    framexleftmargin=1em,                % 框线左间距
    framexrightmargin=1em,               % 框线右间距
    columns=fullflexible
}
\lstset{
    language=VBA,
    backgroundcolor=\color{gray!10},
    escapeinside=``,           % 中文注释处理
}

\begin{document}
\title{XVBA教程}
\author{吕旋延}
\date{\today}
\maketitle

\tableofcontents

\chapter{哈哈哈}

\section{初步}
\begin{lstlisting}[caption={生成斐波那契数列},label={code:fib}]
'`斐波那契数列生成函数`
Sub GenerateFibonacci()
    Dim n As Integer
    Dim i As Integer
    Dim fib() As Long
    
    n = InputBox("请输入数列项数:", "输入", 10)
    ReDim fib(n)
    
    fib(0) = 0
    fib(1) = 1
    
    For i = 2 To n - 1
        fib(i) = fib(i - 1) + fib(i - 2)
    Next i
    
    '`输出结果`
    MsgBox "前" & n & "项斐波那契数列:" & vbCrLf & Join(fib, ", ")
End Sub
    
\end{lstlisting}
\end{document}

PDF 的问题,如 @u40 老师所说:

我的解决方案就是 pdf2ps SDUlogo.pdf epstopdf SDUlogo.ps 然后就OK了

或者 Inkscape / AI 重新导出,也能解决问题.


后记

我尝试了使用

gs -o <output.pdf> sDEVICE=pdfwrite <input.pdf>

以及

mutool clean -a -z -d -gggg <input.pdf> <output.pdf>

均无法修复,此问题可能涉及在以前 dvipdfm-x 程序导致 Inkscape 导出的 PDF 插入后使用 xelatex 编译透明度失效,后被 @马起园 老师修复,但是又牵扯进来新的问题. 当然也不一定是这个问题导致的. 想要引擎层面彻底解决,需要比对处理前后的PDF,找出是什么导致了这个问题?并提交 Issue(前提是,如果是某段inputstream 导致,那只能硬着头皮提交了,把分析工作交给他们...)

你只有 \begin,没有 \end,当然编译出不来啊...

image.png

\documentclass{ctexart}
\usepackage{mathtools}
\title{二队关于插值的理解(主要来源于司守奎老师)}
\author{二队\and 为啥\thanks{这次我了解到并知道怎么会用脚注了}
\and 就是
\and 就是就是}
\date{\today}
\begin{document}

\[
  l_0(x) =
  \begin{cases}
    \frac{(x - x_1)}{x_0 - x_1}, & x \in [x_0,x_1] \\
    0,                           & \text{其他}
  \end{cases}
\]    
    
\end{document}

Edit

或者你可以用 parabola 路径绘制抛物线,然后在同一条路径中绘制椭圆弧,然后再绘制抛物线返回原点,这样效果或许会更好些.

image.png

这个 solution 的方案见最下方代码的上半部分的 tikzpicture 环境


Original Answer

添加 line cap = round,然后根据你画的抛物线 1/16*pow(8, 2),那么切点坐标是 8^2/16 = 4,那么椭圆的半长州值我也给你改了改,拼合痕迹没了.

但是还是会相交一点,这个问题是数学问题,俾人数学能力有限,你可以请教下数学方面的同学(比如改用别的曲线)


\documentclass[tikz, border = 10pt]{standalone}

\begin{document}

\begin{tikzpicture}[scale = .5]
  \draw (8,0) ellipse (.4 and 4);
  \draw [ line join = round ] (0,0) parabola (8,4) arc (90:-90:.4 and 4) parabola bend (0,0) (0,0) -- cycle;
\end{tikzpicture}
      
\begin{tikzpicture}[scale = .5]
  \draw[domain=0:8, smooth, variable=\x, line cap = round]  plot ({\x}, {1/16*pow(\x, 2)});   
  \draw[domain=0:8, smooth, variable=\x, line cap = round]  plot ({\x}, {-1/16*pow(\x, 2)});
  \draw (8,0) ellipse (.4 and 4);
\end{tikzpicture}
  
\end{document}

只画一个,后面的你可以选择套用循环,或者复制粘贴

\documentclass{ctexart}

\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
  \node [ circle, draw ] (a) {};
  \node [ circle, draw, fill, xshift = 1cm ] (b) at (a) {};
  \node [ circle, draw, fill, shift = {({sin(18)}, {cos(18)})} ] (c) at (b) {};
  \node [ circle, draw, fill, shift = {({-cos(36)}, {sin(36)})} ] (d) at (c) {};
  \node [ circle, draw, fill, shift = {({-cos(36)}, {-sin(36)})} ] (e) at (d) {};
  \draw (a) -- (b) -- (c) -- (d) -- (e) -- (a);
\end{tikzpicture}

\end{document}

可以像 xcolor 那样 $(B)!0.5!(D)$,当然由于需要运算模式 $$ 包裹,tikzcalc 库是需要被调用的

The following is an example:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}

\begin{document}

\begin{tikzpicture}
  \coordinate [label = right: $B$] (B) at (1,3);
  \coordinate [label = right: $D$] (D) at (2,4);
  \coordinate [label = right: $E$] (E) at ($(B)!0.5!(D)$);
\end{tikzpicture}

\end{document}

这是2e的版本,请参考CTAN上的User's manual: notebeamer

截图中的 expl3 使用命令方式重制版暂未发布,请等待更新.

Update on 11:40, 15/10/2024: Version 4.1A已发布
Archive.zip

image.png

  1. 有些地方你在加粗中使用了换行 \textbf{...\\...},给你改过来了
  2. 你未提供插入的那个图像,我用 example-image 给你替代了,记得改过来
  3. 循环问题 我用 expl3int_step_inline 给你重写了 [其实 \foreach 貌似也可以,但这应该是我的职业病 :)] 里面 #1 代表变量,你可以自己在这个基础上改.
  4. geometry 给你改了,不然好几页表格都塞不下 :(

The following figure is a preview of the final effect

image.png

ask10122024.pdf
ask10122024.tex

发布
问题