Sagittarius Rover
Sagittarius Rover
这家伙很懒,什么也没写!

注册于 3年前

回答
490
文章
0
关注者
17

问题似乎很好解决...虽然明显「xelatex」有严重的问题(「xelatex」什么时候彻底淘汰啊!!真该死啊!!)

另外,为何一定要使用polyglossia而不是babel,后者似乎没有"Contents"的目录问题,和ctex的兼容性更好。

最佳实践

\begin{sanskrit}कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं\end{sanskrit}

(或者同样在xe下有问题的)

\begin{otherlanguage}{sanskrit}
कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं
\end{otherlanguage}

全部替换为

\textsanskrit{कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं}

或者

\begin{otherlanguage*}{sanskrit}
कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं
\end{otherlanguage*}

似乎则可以防止在.toc中写入脏东西(无论xe还是lua都work)

\documentclass[
    UTF8,openany,
    a4paper,zihao=-4,
    fontset=none
]{ctexbook}
\usepackage[paperheight=17cm]{geometry}
\ctexset{
    chapter/name = {第,章},
    % section/name = {},
    % contentsname = \hfill 目\ 录 \hfill,
}
\setCJKmainfont[BoldFont=KaiTi,ItalicFont=FangSong]{NSimSun}
\setmainfont[BoldFont=Times New Roman]{Times New Roman}
\usepackage{polyglossia}
\setotherlanguage{sanskrit}
\newfontfamily\sanskritfont[Script=Devanagari]{Sanskrit2003.ttf}

\begin{document}
\renewcommand{\contentsname}{目\ 录}%after \begin{document}!
\frontmatter
\tableofcontents
\chapter{导论}
梵语
\footnote{梵语(梵语:\textsanskrit{संस्कृता वाक्},Saṃskṛtā vāk,简称\begin{otherlanguage*}{sanskrit}संस्कृतम्\end{otherlanguage*},Saṃskṛtam;英语Sanskrit)属于印欧语系中印度–伊朗语族的印度–雅利安语支,是该语系中最古老的语言之一。和拉丁语一样,梵语已经成为一种属于学术和宗教的专门用语。虽然现代梵语的母语使用者非常少,但是因为梵文本身的特殊性,在现代佛教、印度教和耆那教的经典中依然可以随处找到梵语。古印度相信梵文是由梵天发明。}
优雅动听,是印度高等种姓以及更早雅利安人所说的语言,历史比其它任何已知语言都更为久远。
\chapter{梵语的格}
主格:用于句子的主语。宾格:用作直接宾语,也用于“to”表达的与格(间接宾语)。具格:在英语中用于“by”,“with”或“by means of”句式中。与格:在“for”,“to”或“toward”意思上使用。离格:在“of”和“from”意思上使用。
\begin{otherlanguage*}{sanskrit}
कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं
\end{otherlanguage*}
\mainmatter
\chapter{主格}
\textsanskrit{कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं}
\chapter{宾格}
\textsanskrit{कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं}
\chapter{具格}
\begin{otherlanguage*}{sanskrit}
कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं
\end{otherlanguage*}
\chapter{与格}
\textsanskrit{कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं}
\end{document}

image.png

事实上,如下的多个字体配置宏包功能可能相互冲突:

  • ctex(xeCJK/luatexja)
  • bidi
  • babel
  • polyglossia

既然已经选定了使用polyglossia做杂语支持,一种workaround是可以直接使用polygollssia的框架,不过「字体选择似乎有些受限(无法实现西文用TNR中文用NSimSun)」且「会失去\ctexsetformat的功能」...

基于纯polyglossia的方案

没有细调的一份代码如下:

\documentclass[openany]{book}
\usepackage{zhlipsum}
\usepackage{zhnumber}
\usepackage{fontspec}
\usepackage{polyglossia}
% \setmainfont{Times New Roman}
% \setCJKmainfont{NSimSun}
% \setmainfont{NSimSun}
\setdefaultlanguage{chinese}
\setmainfont{Noto Serif CJK SC}
\setotherlanguage{sanskrit}
\newfontfamily\sanskritfont[Script=Devanagari]{Sanskrit2003.ttf}
\usepackage{setspace}%
\setstretch{1.5}%
\usepackage{titlesec}
\usepackage{titletoc}
\titleformat{\chapter}{\filcenter\Huge\bfseries}{第\zhnum{chapter}章}{1cm}{}
\titlecontents{chapter}[3.8em]{}{第\zhnumber{\thecontentslabel}章\quad}{}{\hfill\bfseries\thecontentspage}
\begin{document}
\frontmatter
\tableofcontents
\chapter{导论}
梵语\footnote{梵语(梵语:\begin{sanskrit}संस्कृता वाक्\end{sanskrit},Saṃskṛtā vāk,简称\begin{sanskrit}संस्कृतम्\end{sanskrit},Saṃskṛtam;英语Sanskrit)属于印欧语系中印度–伊朗语族的印度–雅利安语支,是该语系中最古老的语言之一。}优雅动听优雅动听,是印度高等种姓以及更早雅利安人所说的语言,这是一段中English 0123-4567英混排历史 history 比其它任何已知语言都更为久远。\zhlipsum[2]
\chapter{梵语的格}
主格:用于句子的主语。
\begin{sanskrit}कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं\end{sanskrit}
\mainmatter
\chapter{主格}
\begin{sanskrit}कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं\end{sanskrit}
\chapter{宾格}
\begin{sanskrit}कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं\end{sanskrit}
\chapter{具格}
\begin{sanskrit}कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं\end{sanskrit}
\chapter{与格}
\begin{sanskrit}कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं\end{sanskrit}
\end{document}

image.png

本人使用TeXstudio编辑器。因latex编译的PDF文件目录有显示问题,需编译前修改.toc文件

为什么不从根源出发,直接修复.tex文件的问题。

但每次编译前都要修改文件太繁琐,想通过宏(Script Macros)命令解决。

从你的描述来看,这个问题和「对任意一个文本文件进行该操作」无异,只是这个文件恰好是「.toc」,因此可以认为这个问题和LaTeX其实不太相关。

曾尝试通过AI生成脚本,但执行总通不过。

你并未提供别人可以复现的所有必要信息。

你最好举例说明.toc文件的具体情况,具体要如何匹配「删除文件中全部有字符串\selectlanguage *{sanskrit}\selectlanguage *[script=Devanagari,numerals=Devanagari]{sanskrit}的行;」。例如这里\selectlanguage其后是否总是有空格,是否除了这两种情况还可能有其他的情况,这都可能影响脚本的写法。

最好补充给一个.toc修改前的范例和预期的脚本处理结果。否则别人不容易复现和测试。


Edited:

要注意阅读文档:

应该先明确这个「编辑宏」的功能支持哪些语法....「QFile未定义显然是因为TeXStudio的脚本功能不支持这个"类"...」

我稍微vibe了一下,下面这个脚本似乎可行:

function cleanToc() {
    var texFile = app.getCurrentFileName();
    if (!texFile) {
        alert("没有打开任何文件。");
        return;
    }

    var tocFile = texFile.replace(/\.[^.]+$/, "") + ".toc";

    var content = readFile(tocFile);
    if (content === undefined || content === null) {
        alert("无法读取 " + tocFile);
        return;
    }

    var lines = content.split(/\r?\n/);
    var result = [];
    var deleted = 0;

    // 匹配所有 \selectlanguage *{sanskrit} 以及带可选参数的形式
    var re = /^\s*\\selectlanguage\s*\*(?:\[[^\]]*\])?\{sanskrit\}/i;

    for (var i = 0; i < lines.length; i++) {
        var line = lines[i];

        if (re.test(line.trim())) {
            deleted++;
            continue;
        }

        result.push(line);
    }

    writeFile(tocFile, result.join("\n"));

    alert("清理完成:删除 " + deleted + " 行。\n文件:" + tocFile);
}

cleanToc();

但是你没有提供别人可以复现的条件...我无法测试...

Before

image.png

Run

image.png

After

image.png

其中

    // 匹配所有 \selectlanguage *{sanskrit} 以及带可选参数的形式
    var re = /^\s*\\selectlanguage\s*\*(?:\[[^\]]*\])?\{sanskrit\}/i;

为匹配的正则表达式,可能要按需修改

另外,为什么不从源头入手,「目录有问题」具体是哪里有问题?上述工作流非常不顺畅,而且路径也是写死的...

总的来说这个需求并不太合理....

  • 代码请给完整,否则别人要手动帮你补全,一些与导言区有关的问题,可能无法复现,这可能增加沟通成本...
  • 建议避免使用无意义的「\label{eq:06}」作为标签,设想你突然要增加一个编号公式,那么你很可能面临一次性修改eq:04~eq:20的窘境。可以使用有意义的名称例如「\label{eq:二次优化问题}」,这样引用也方便...
  • 可以试试嵌套aligned:
\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{lipsum}
\usepackage{amsmath}
\begin{document}
\lipsum[2][1-5]
\begin{equation}
    \begin{aligned}
        \min _{a_{i}^{*}, a_{i}} \frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} & \left(a_{i}^{*}-a_{i}\right)\left(a_{j}^{*}-a_{j}\right) \phi_{Z}\left(X_{i}\right)^{T} \phi_{Z}\left(X_{j}\right)-\sum_{i=1}^{n}\left[y_{i}\left(a_{i}^{*}-a_{i}\right)-\varepsilon\left(a_{i}^{*}+a_{i}\right)\right], \\
        \text { s.t. } \quad & \sum_{i=1}^{n}\left(a_{i}^{*}-a_{i}\right)=0, \\
        & 0 \leq a_{i}^{*}, a_{i} \leq C, \\
        &%<-aligned in aligned inside equation;-) 
        \begin{aligned}
            \phi_{Z}\left(X_{i}\right)^{T} \phi_{Z}\left(X_{j}\right)&=\varphi\left(K_{D E K F}\left(X_{i}, Z\right)\right)^{T} \varphi\left(K_{D E K F}\left(X_{j}, Z\right)\right), \\
            & =\left\langle\varphi\left(K_{D E K F}\left(X_{i}, Z\right)\right), \varphi\left(K_{DEKF}\left(X_{j}, Z\right)\right)\right\rangle, \\
            & =K\left(K_{D E K F}\left(X_{i}, Z\right), K_{D E K F}\left(X_{j}, Z\right)\right),
        \end{aligned} 
    \end{aligned}
\end{equation}

\lipsum[2][1-5]
\end{document}

image.png

基于zref-clever的一个处理方案...

目前最简便的方案还是需要修改elegantbook.cls...这对于已经frozen的项目是不友好的❗

一旦修改了.cls,则该模板已经不再是公开意义上的官方模板不能再被叫做「elegantbook模板」,而只能是「myelegantbook模板」,且模板的使用者必须对该模板的修改负完全责任❗❗❗

不太妥当的方案,将这里的这段代码修改为:

%   elegantbook.cls#L1001-L1016
    \DeclareTColorBox[auto counter,number within=\ELEGANT@thmcnt,usesamecnt,usecnt]{#1}{ g o t\label g }{
        common,#3,
        label type=#1,%<-add label type key here
        IfValueTF={##1}
          {ELEGANT@title={#1}{##1}}
          {
            IfValueTF={##2}
            {ELEGANT@title={#1}{##2}}
            {ELEGANT@title={#1}{}}
          },
        IfValueT={##4}
          {
            IfBooleanTF={##3}
              {label={##4}}
              {ELEGANT@label={#2}{##4}}
          }
      }

若如此做,对于下面的MWE文件main.tex

\documentclass[lang=cn,fontset=fandol]{elegantbook}
\geometry{paperheight=14cm}
\usepackage{zref-clever}
\zcRefTypeSetup{theorem}{
    Name-sg={定理},name-sg={定理},
    Name-pl={定理},name-pl={定理},
}
\zcRefTypeSetup{definition}{
    Name-sg={定义},name-sg={定义},
    Name-pl={定义},name-pl={定义},
}

\begin{document}
\chapter{111}

\begin{definition}{Wang定义}{Wang}
    这是一个定义。
\end{definition}

\begin{theorem}{欧拉定理}{Euler}
    这是一个定理。
\end{theorem}

\zcref{def:Osbert} 

\zcref{def:Wong}

\zcref{def:Wang}

\chapter{222}

\begin{definition}{Wong定义}{Wong}
    这是一个定义。
\end{definition}

\begin{definition}{Osbert定义}{Osbert}
    这是一个定义。
\end{definition}

\begin{theorem}{欧几里得公理}{Euclide}
    这是另一个定理。
\end{theorem}

\zcref{thm:Euler}

\zcref{thm:Euclide} 

\end{document}

将得到:

image.png

要想「不修改.cls文件」,关键在于在已经写死的\DeclareTColorBox{env}中,是否有简单的方法对每个env添加一个新的键值对...

不过要添加的label type恰好其值为#1,也不能说上面的实现是坏的。

Noted that:

  • tcolorbox在2023年才加入对zref-clever的支持
  • elegantbook已经在2022-12-31停止维护...

这个锅不太应该由本修改(改的不好)来背,算是「2025年」的今天需要为了一些版本更迭造成的时间摩擦付出一些小小的代价吧...如果有朝一日elegantbook能增加新的feature,本post也许可能提供些许帮助...

Hope it helps!

基于cleveref方案的一个处理方案

感谢@听风看雨 的提示:

初始选项

crefname={bluebox}{blueboxes}

实际上只是

\crefname{tcb@cnt@mybluebox}{bluebox}{blueboxes}

换言之上述的第一个mwe可以有另一个「更内部」的实现:

\documentclass[12pt]{article} 
\usepackage[
    noheadfoot,
    margin=8mm,
    papersize={10cm,10cm},
]{geometry} 
\usepackage{cleveref}
\usepackage{tcolorbox}
\newtcolorbox[
    auto counter,
    number within=section,
    % crefname={bluebox}{blueboxes}
]{mybluebox}[2][]{
    % label is label,% default value
    colback=blue!5!white,
    colframe=blue!75!black,
    fonttitle=\bfseries,
    title=Bluebox \thetcbcounter: #2,#1
}
% add here<-
\makeatletter
\crefname{tcb@cnt@mybluebox}{bluebox}{blueboxes}
\makeatother
\begin{document} 
\section{Blue}

\begin{mybluebox}[label={myreference}]{My title} 
This is an example.
\end{mybluebox}

\begin{mybluebox}[label={myreference2}]{My titletitle} 
This is an example.
\end{mybluebox}

\noindent
\Cref{myreference}, \cref{myreference}\\ 
\Cpageref{myreference}, \cpageref{myreference}\\ 
\nameCref{myreference}, \namecref{myreference}\\ 
\labelcref{myreference}, \labelcpageref{myreference}\\ 
\Cref{myreference2}, \cref{myreference2}\\
\Cref{myreference,myreference2}, \cref{myreference,myreference2}\\

\end{document}

同样可以得到:

image.png

这意味着我们在elegantlatex框架下,对于基于tcolorboxfancy模式也只需要对相应的环境做如下的patchcref设置即可:

% \usepackage{cleveref}
\makeatletter
\crefname{tcb@cnt@theorem}{\theoremname}{\theoremname}
\crefformat{tcb@cnt@theorem}{\theoremname~#2#1#3}
\crefmultiformat{tcb@cnt@theorem}{\theoremname~#2#1#3}{~和~#2#1#3}{,#2#1#3}{~和~#2#1#3}
\crefrangeformat{tcb@cnt@theorem}{\theoremname~#3#1#4~至~#5#2#6}
\crefname{tcb@cnt@definition}{\definitionname}{\definitionname}
\crefformat{tcb@cnt@definition}{\definitionname~#2#1#3}
\crefmultiformat{tcb@cnt@definition}{\definitionname~#2#1#3}{~和~#2#1#3}{,#2#1#3}{~和~#2#1#3}
\crefrangeformat{tcb@cnt@definition}{\definitionname~#3#1#4~至~#5#2#6}
\makeatother

Code

\documentclass[lang=cn,fontset=fandol]{elegantbook}
\geometry{paperheight=12cm}
\usepackage{cleveref}
\makeatletter
\crefname{tcb@cnt@theorem}{\theoremname}{\theoremname}
\crefformat{tcb@cnt@theorem}{\theoremname~#2#1#3}
\crefmultiformat{tcb@cnt@theorem}{\theoremname~#2#1#3}{~和~#2#1#3}{,#2#1#3}{~和~#2#1#3}
\crefrangeformat{tcb@cnt@theorem}{\theoremname~#3#1#4~至~#5#2#6}

\crefname{tcb@cnt@definition}{\definitionname}{\definitionname}
\crefformat{tcb@cnt@definition}{\definitionname~#2#1#3}
\crefmultiformat{tcb@cnt@definition}{\definitionname~#2#1#3}{~和~#2#1#3}{,#2#1#3}{~和~#2#1#3}
\crefrangeformat{tcb@cnt@definition}{\definitionname~#3#1#4~至~#5#2#6}
\makeatother

\begin{document}
\chapter{111}

\begin{definition}{\LaTeX 定义}{LaTeX}
    这是\LaTeX{}的定义
\end{definition}

\begin{theorem}{欧拉定理}{Euler}
    这是一个定理。
\end{theorem}

\begin{theorem}{毕达哥拉斯定理}{Bachagoras}
    这是一个定理。
\end{theorem}

\cref{def:Osbert} 

\cref{def:Wong,def:LaTeX,def:Wang}

\cref{def:Osbert,def:Wong,def:LaTeX,def:Wang}

\chapter{222}

\begin{definition}{Osbert定义}{Osbert}
    这是一个定义。
\end{definition}

\begin{theorem}{欧几里得公理}{Euclide}
    这是另一个定理。
\end{theorem}

\cref{thm:Euclide} 

\cref{thm:Euler,thm:Bachagoras}

\cref{thm:Euler,thm:Bachagoras,thm:Euclide}


\chapter{333}
\begin{definition}{Wong定义}{Wong}
    这是一个定义。
\end{definition}

\begin{definition}{Wang定义}{Wang}
    这是一个定义。
\end{definition}

\end{document}

这将得到:

image.png

既然我在这里提到:

期待你自行探索wrapfig,wrapfig2以及夏老师的text-figure宏包的使用方法

稍微补充一下其他的方案:

基于两个minipage环境:

\documentclass[fontset=fandol]{ctexart}
\usepackage{showframe}
\usepackage{enumitem}
\usepackage{mathtools}
\usepackage{amsfonts}
\begin{document}
    \section{基于\texttt{minipage}的方案}
    \noindent 已知$\triangle ABC$中,$AB=AC=12$厘米,$BC=9$厘米,点$D$为$AB$中点。
    \par\vspace*{8pt}\noindent
    \begin{minipage}{.7\linewidth}%
        \begin{enumerate}[
            label={(\arabic*)},
            labelindent=1em,
            labelwidth=0.2em,
            labelsep=0.2em,
            leftmargin=3em,
            % parsep=-2pt,
            nosep,%<-我更推荐这个选项
        ]
        \item 如果点$P$在线段$BC$上以3厘米秒的速度由$BC$运动,同时点$Q$在线段$CA$上由$C$点向$A$点运动。若点$Q$的运动速度与点$P$的运动速度相等,当运动1秒时,$\triangle BPD$与$\triangle CQP$是否全等?若点$Q$的运动速度与点$P$的运动速度不相等,当点$Q$的运动速度为多少时,$\triangle BPD \cong \triangle CPQ$?
        \item 若点$Q$以(1)中,的速度从点 $C$ 出发,点 $P$ 以原来运动速度从点$B$出发,都逆时针沿$\triangle ABC$三边运动,多长时间$P$与$Q$第一次相遇,此时在$\triangle ABC$哪条边上相遇?
        \end{enumerate}
    \end{minipage}%
    \begin{minipage}{.3\linewidth}
        \begin{center}
            \includegraphics[width=3.5cm,height=6cm]{example-image-duck}
        \end{center}
    \end{minipage}%
\end{document}

基于text-figure宏包

这个包是@u10945 基于写的,没有发在CTAN上,需要自行下载(需要在这里获取text-figure_usermanual.pdf
)...如非必要,可以不使用...

我在这里做演示,也同样只是锻炼一下自己"一题多解"的能力...

\documentclass[fontset=fandol]{ctexart}
\usepackage{showframe}
\usepackage{enumitem}
\usepackage{mathtools}
\usepackage{amsfonts}
\usepackage{text-figure}
\begin{document}
    \section{基于\texttt{text-figure}的方案}
    \noindent 已知$\triangle ABC$中,$AB=AC=12$厘米,$BC=9$厘米,点$D$为$AB$中点。
    \textfigure[fig-pos = right,text-ratio=.68]{
        \begin{enumerate}[
            label={(\arabic*)},
            labelindent=1em,
            labelwidth=0.2em,
            labelsep=0.2em,
            leftmargin=3em,
            nosep,%<-我更推荐这个选项
        ]
        \item 如果点$P$在线段$BC$上以3厘米秒的速度由$BC$运动,同时点$Q$在线段$CA$上由$C$点向$A$点运动。若点$Q$的运动速度与点$P$的运动速度相等,当运动1秒时,$\triangle BPD$与$\triangle CQP$是否全等?若点$Q$的运动速度与点$P$的运动速度不相等,当点$Q$的运动速度为多少时,$\triangle BPD \cong \triangle CPQ$?
        \item 若点$Q$以(1)中,的速度从点 $C$ 出发,点 $P$ 以原来运动速度从点$B$出发,都逆时针沿$\triangle ABC$三边运动,多长时间$P$与$Q$第一次相遇,此时在$\triangle ABC$哪条边上相遇?
        \end{enumerate}
    }{
        \includegraphics[width=3.5cm,height=6cm]{example-image-duck}
    }
\end{document}

image.png

基于wrapstuff宏包

\documentclass[fontset=fandol]{ctexart}
\usepackage{showframe}
\usepackage{enumitem}
\usepackage{mathtools}
\usepackage{amsfonts}
\usepackage{wrapstuff}
\usepackage{lipsum}%
\begin{document}
    \section{基于\texttt{wrapstuff}的方案}
    
    \lipsum[2]

    \noindent 已知$\triangle ABC$中,$AB=AC=12$厘米,$BC=9$厘米,点$D$为$AB$中点。
    \begin{wrapstuff}[r,top=0] 
        \includegraphics[width=3.5cm,height=6cm]{example-image-duck}
    \end{wrapstuff} 
    \begin{enumerate}[
        label={(\arabic*)},
        labelindent=1em,
        labelwidth=0.2em,
        labelsep=0.2em,
        leftmargin=3em,
        nosep,%<-我更推荐这个选项
    ]
    \item 如果点$P$在线段$BC$上以3厘米秒的速度由$BC$运动,同时点$Q$在线段$CA$上由$C$点向$A$点运动。若点$Q$的运动速度与点$P$的运动速度相等,当运动1秒时,$\triangle BPD$与$\triangle CQP$是否全等?若点$Q$的运动速度与点$P$的运动速度不相等,当点$Q$的运动速度为多少时,$\triangle BPD \cong \triangle CPQ$?
    \item 若点$Q$以(1)中,的速度从点 $C$ 出发,点 $P$ 以原来运动速度从点$B$出发,都逆时针沿$\triangle ABC$三边运动,多长时间$P$与$Q$第一次相遇,此时在$\triangle ABC$哪条边上相遇?
    \end{enumerate}
    \wrapstuffclear

    \lipsum[2]
\end{document}

image.png

需要指出的是,wrapstuff实现的是「图文环排」,而不只是「图文并排」。前者的难度远高于后者,详见wrapstuff文档。

image.png

加上overlay.

\documentclass{ctexbeamer}
\usepackage{tikz}
\usetikzlibrary{calc}
\setbeamertemplate{footline}{
   %\hspace*{-0.2pt}%
  \begin{tikzpicture}
    \def\r{1pt}
    \def\d{0.3pt}
    \coordinate (A) at (0,1.3em);
    \coordinate (B) at ($(A)+(0:{\paperwidth-(\r)-(\d)})$);
    \draw[red,overlay] (A)--(B);
    \fill[fill=white,line width=\d] (B) circle (\r);
    \node[anchor=south west,inner sep=0pt,outer sep=0pt,fill=red] at (0,0){\color{white}测试测试测试};
  \end{tikzpicture}
}
\begin{document}
\begin{frame}
  测试
\end{frame}
\end{document}

具体原因我也不是非常清楚,因为\draw (A)--(B);会向左增大整个tikzpicturebounding box.
我相信其他坛友能给出更详细的解释...

image.png

阅读: 提问的智慧

请言之有物

  • 具体是什么国家标准?
  • 具体的下载链接是什么?
  • 你是如何编译的?
  • 上面的信息是报错信息?还是?

要避免模糊的描述让别人做猜测,同时要小心XY-problem

提问最好给个具体的例子,并指明预期效果,否则让人很难理解...

试试...

\documentclass{beamer}
\usetheme{moloch}
\usepackage{etoolbox}
\makeatletter
\newcount\beamer@sectionstartframe
\beamer@sectionstartframe=1
\apptocmd{\beamer@section}{\addtocontents{nav}{\protect\headcommand{%
            \protect\beamer@sectionframes{\the\beamer@sectionstartframe}{\the\c@framenumber}}}}{}{}
\apptocmd{\beamer@section}{\beamer@sectionstartframe=\c@framenumber\advance\beamer@sectionstartframe by1\relax}{}{}
\AtEndDocument{\immediate\write\@auxout{\string\@writefile{nav}%
        {\noexpand\headcommand{\noexpand\beamer@sectionframes{\the\beamer@sectionstartframe}{\the\c@framenumber}}}}}{}{}
\def\beamer@startframeofsection{1}
\def\beamer@endframeofsection{1}
\def\beamer@sectionframes#1#2{%
    \ifnum\c@framenumber<#1%
    \else%
    \ifnum\c@framenumber>#2%
    \else%
    \gdef\beamer@startframeofsection{#1}%
    \gdef\beamer@endframeofsection{#2}%
    \fi%
    \fi%
}
\newcommand\insertsectionstartframe{\beamer@startframeofsection}
\newcommand\insertsectionendframe{\beamer@endframeofsection}
\makeatother

\setbeamertemplate{headline}{
    \Large\sffamily 
    \inteval{\insertframenumber - \insertsectionstartframe + 1} 
    /
    \inteval{\insertsectionendframe - \insertsectionstartframe + 1}
}

\begin{document}
\begin{frame}sec=0,framenumber=1\end{frame}
\begin{frame}sec=0,framenumber=2\end{frame}
\begin{frame}sec=0,framenumber=3\end{frame}
\section{Sec1}
\begin{frame}sec=1,framenumber=1
    \begin{itemize}
        \item<1-> First item
        \item<2> Second item
        \item<3-> Third item
    \end{itemize}
\end{frame}
\begin{frame}sec=1,framenumber=2\end{frame}
\begin{frame}sec=1,framenumber=3\end{frame}
\section{Sec2}
\begin{frame}sec=2,framenumber=1\end{frame}
\begin{frame}sec=2,framenumber=2\end{frame}
\section{Sec3}
\begin{frame}sec=3,framenumber=1\end{frame}
\begin{frame}sec=3,framenumber=2\end{frame}
\begin{frame}sec=3,framenumber=3\end{frame}
\begin{frame}sec=3,framenumber=4
    \begin{itemize}
        \item<1-> First item
        \item<2-> Second item
        \item<3> Third item
        \item<4-> Third item
    \end{itemize}
\end{frame}
\begin{frame}sec=3,framenumber=5\end{frame}
\end{document}

output_1.png

如果只是要给公式加虚线框,可以直接使用texdoc dashbox(可以参见这里).

但你这个具体的例子中,有较为严格的对齐关系,且对箭头样式似乎也有要求,还是考虑nicematrix

\documentclass{article}
\usepackage{amsmath}
\usepackage{nicematrix}
\usepackage{tikz}
\newcommand{\myarrow}[1][.75]{\tikz\draw[latex-latex,semithick](0,0)--(0,#1);}
\begin{document}

before $\begin{NiceArray}[c]{@{}*{18}{c@{}}}
x^3 & \,+\, & 2^3 & \;=\; & ( & x & \,+\, & 2 & ) & ( & x^2 & \,-\, & x & \,\cdot\,& 2 & \,+\, & 2^2 & ) \\
\myarrow &  & \myarrow &  &  & \myarrow &  & \myarrow &  &  & \myarrow &  & \myarrow &  & \myarrow &  &\myarrow\\[-1pt]
a^3 & \,+\, & b^3 & \;=\; & ( & a & \,+\, & b & ) & ( & a^2 & \,-\, & a &\,\cdot\, & b & \,+\, & b^2 & )
\CodeAfter
\tikz[line cap=round]
\draw[densely dotted,semithick] 
([xshift=-.6em]2-1.west) rectangle ([shift={(.2em,-1ex)}]3-3.south east) 
([xshift=-.8em]2-6.west) rectangle ([shift={(.6em,-1ex)}]3-17.south east)
;
\end{NiceArray}$ after

\end{document}

注意其中对「原子」间距的微调。另外最好给完整代码,避免别人需要根据代码猜测导言区使用了什么包,减轻潜在回答者的负担。

image.png

并不太简单,需要注意不少细节。而且大量\multicolumn散落分布在表格正文中其实是会影响表格代码的可读性的。

虽然tabularray提供了方便的接口,但是基础的也得会!

两手都要抓,两手都要硬!

没记错的话,高中数学也 切忌 过于追求高等数学的高观点“秒杀”法,比较繁琐的计算、基础的方法更是重中之重。

从一名学习者的角度,个人还是建议都掌握😀用的时候选择「最佳实践」即可。

只要加上\cline{2-6}就报错,删掉或改成\cline{2-3}就通过

\cline{2-6}报错的主要原因是合并后仅剩4列了...

\documentclass[11pt,space]{ctexart}
\usepackage{showframe}
\usepackage{array}
\usepackage{multirow}
\begin{document}
\noindent%
\begin{tabular}{|*{2}{c|}*{2}{>{\centering\arraybackslash}m{4cm}|}}
    \hline
    \multicolumn{4}{|c|}{$y=a^x(a>0,a\neq 1)$} \\ 
    \hline
    \multicolumn{2}{|c|}{\multirow{6.25}{*}{图象}} & $a>1$  & $0<a<1$  \\
    \cline{3-4}
    %问题1:如何调节行高,留出画图的空间?
    \multicolumn{2}{|c|}{} %<- 刻意用于占位以避免垂直竖线
     &\vbox{\vspace{3cm}} &  \\
    \hline  
    \multirow{7}{*}{性质} & 定义域 &  \multicolumn{2}{c|}{}\\
    \cline{2-4}%<-add % 问题2:如何给后6行画横线?
    & 值域   & \multicolumn{2}{c|}{}  \\ 
    \cline{2-4}%<-add
    & 定点   & \multicolumn{2}{c|}{} \\
    \cline{2-4}%<-add
    & 单调性 & \multicolumn{2}{c|}{} \\ 
    \cline{2-4}%<-add
    & 奇偶性 & \multicolumn{2}{c|}{} \\
    \cline{2-4}%<-add
    & 对称性 & $y=a^x$~与~$y=(\frac{1}{a})^x$的图象关于\qquad 对称 & \\ 
    \hline
\end{tabular}

\end{document}

image.png

  • 提问时描述预期效果最好用图,只用语言描述可能导致误解...(虽然这里没有什么歧义...)
  • 要善用文档里提到的便捷语法、避免大量冗余代码
  • 合并行和合并列方式是类似的...
  • 「如何在第2行的a>10<a<1下面画横线」...其实不要理解为画线,理解为被合并前的单元格会更合适...
\documentclass[11pt,space]{ctexart} 
\usepackage{tabularray}
\begin{document}
\SetTblrInner{hlines, vlines, hspan=minimal}
\begin{tblr}{
    colspec = {Q[c,m,wd=10mm]Q[c,m,wd=20mm]Q[c,m,wd=30mm]Q[c,m,wd=30mm]}, 
    row{1} = {ht=10mm},
    row{3} = {ht=40mm},
    cell{1}{1}={c=4}{c},
    % cell{2}{1}={c=2}{c},%<--
    cell{2}{1}={c=2,r=2}{c},
    cell{4-8}{3}={c=2}{l},
    cell{4}{1}={r=6}{c},%<-合并第1列后6行
  }
    $y=a^x(a>0,a\neq 1)$ &  &  &        \\  
    图象 &           & $a>1$  & $0<a<1$ \\  
    &  & &  \\%<-新增一个空行用于合并(a.k.a. 在第2行的a>1和0<a<1下面画横线)
    性质 & 定义域 & & \\ 
    & 值域   & &  \\ 
    & 定点   & &  \\ 
    & 单调性 & &  \\ 
    & 奇偶性 & &  \\
    & 对称性 & $y=a^x$~与~$y=(\frac{1}{a})^x$的图象关于$y=x$对称 & \\
\end{tblr}

\end{document}

image.png

如果有较多类似的教学表格排版需求,可以在本站搜索有关的回答参考学习:

时隔一年,一个简化版coffin递归实现可见:

\documentclass[border=5pt]{standalone}
\usepackage{fourier}
\usepackage{cmupint}
\usepackage{fixdif}
\DeclareRobustCommand{\myint}{$\displaystyle\int\nolimits$}

\begin{document}

\ExplSyntaxOn

% 基础内容盒子
\coffin_new:N \l_base_int_coffin
\hcoffin_set:Nn \l_base_int_coffin { \myint }
\coffin_new:N \l_base_dx_coffin
\hcoffin_set:Nn \l_base_dx_coffin { $x \d x$ }

% 递归用的临时变量
\coffin_new:N \l_rec_root_coffin
\coffin_new:N \l_rec_child_coffin
\coffin_new:N \l_rec_dx_coffin

% 全局变量
\coffin_new:N \g_export_tmp_coffin
\coffin_new:N \l_final_result_coffin

\cs_new_protected:Npn \typeset_integral_recursive:Nnn #1 #2 #3
  {
    \group_begin:
      % 当前层的 Root
      \coffin_set_eq:NN \l_rec_root_coffin \l_base_int_coffin
      \coffin_scale:Nnn \l_rec_root_coffin { #3 } { #3 }
      
      % 当前层的 dx 
      \coffin_set_eq:NN \l_rec_dx_coffin \l_base_dx_coffin
      \coffin_scale:Nnn \l_rec_dx_coffin { #3 } { #3 }

      \int_compare:nNnTF { #2 } = { 0 }
        {
          \coffin_join:NnnNnnnn 
              \l_rec_root_coffin { r } { vc } 
              \l_rec_dx_coffin { l } { vc } { 0pt } { 0pt }
        }
        {
          % 递归
          % 计算子层缩放比例
          \fp_set:Nn \l_tmpa_fp { #3 * 0.5 }
          % 递归生成子节点
          \typeset_integral_recursive:Nnn \l_rec_child_coffin
            { \int_eval:n { #2 - 1 } } 
            { \l_tmpa_fp }

          % 拼接子节点到 Root
          \coffin_join:NnnNnnnn 
            \l_rec_root_coffin { r } { t } 
            \l_rec_child_coffin { l } { vc } { 0pt } { 0pt }
          \coffin_join:NnnNnnnn 
            \l_rec_root_coffin { r } { b } 
            \l_rec_child_coffin { r } { vc } { 0pt } { 0pt }
          \coffin_join:NnnNnnnn 
            \l_rec_root_coffin { r } { vc } 
            \l_rec_dx_coffin { l } { vc } { 0pt } { 0pt }
        }
      \coffin_gset_eq:NN \g_export_tmp_coffin \l_rec_root_coffin
      
    \group_end:
    \coffin_set_eq:NN #1 \g_export_tmp_coffin
  }

\typeset_integral_recursive:Nnn \l_final_result_coffin { 5 } { 2.0 }

\coffin_typeset:Nnnnn \l_final_result_coffin { l } { vc } { 0pt } { 0pt }

\ExplSyntaxOff

\end{document}

image.png

其实可以不用coffin的,但是注意到整体积分上下限的位置并不好控制,进一步的不成功实践如下:

\documentclass[border=5pt,multi=tmpenv]{standalone}
\usepackage{amsmath}
\usepackage{fouriernc}
\usepackage{cmupint}
\usepackage{fixdif}
\parindent=0pt
% \DeclareMathOperator{\myint}{\int\nolimits}
\DeclareRobustCommand{\myint}{\int\nolimits}
\newcommand{\basicint}{\myint_0^1xdx}
\newcommand{\basicintt}{\myint_{\basicint}^{\basicint}xdx}
% https://tex.stackexchange.com/a/5192/322482
\makeatletter
\newcommand{\raisemath}[1]{\mathpalette{\raisem@th{#1}}}
\newcommand{\raisem@th}[3]{\raisebox{#1}{$#2#3$}}
\makeatother
\newcommand{\originintunit}{%
    \displaystyle\myint_{
    \textstyle\myint^{0}_{\basicintt}
    }^{
        \textstyle\myint_{1}^{\basicintt}
    }
}%
\newcommand{\intunit}[2]{%
    \myint_{
        \myint^{0}_{\myint_{#1}^{\basicint}xdx}
    }^{
        \myint_{1}^{\myint_{\basicint}^{#2}xdx}
    }
}
\ExplSyntaxOn
% \cs_generate_variant:Nn \tl_use:N {V}
\tl_new:N \l_explorer_base_tl
\tl_new:N \l_explorer_tmp_tl
\tl_new:N \l_explorer_script_tl
\tl_new:N \g_export_tmp_tl 

\cs_new_protected:Npn \typeset_integral_recursive:Nn #1#2
{
    % #1:tl to store
    % #2:depth
    \group_begin:
      \tl_set_eq:NN \l_explorer_tmp_tl #1
        \int_compare:nNnTF { #2 } = { 0 }
            {
               \tl_put_right:Ne \l_explorer_tmp_tl { \intunit{\basicint}{\basicint} }
            }
            {
                \tl_clear:N \l_explorer_script_tl
                \typeset_integral_recursive:Nn \l_explorer_script_tl { \int_eval:n { #2 - 1 } } 
                \tl_put_right:Ne \l_explorer_tmp_tl { \intunit{\l_explorer_script_tl}{\l_explorer_script_tl} } 
            }
        \tl_put_right:Nn \l_explorer_tmp_tl { xdx } 
        \tl_gset_eq:NN \g_export_tmp_tl \l_explorer_tmp_tl
    \group_end:
    \tl_set_eq:NN #1 \g_export_tmp_tl
}

% \typeset_integral_recursive:Nn \l_explorer_base_tl { 4 }

\NewDocumentCommand{\exploreint}{ m }{
    \begingroup
    \typeset_integral_recursive:Nn \l_explorer_base_tl { #1 }
    \begin{tmpenv}
    $\l_explorer_base_tl$
    \end{tmpenv}
    \endgroup
}
\ExplSyntaxOff

\newenvironment{tmpenv}{}{}
\begin{document}

\exploreint{0}

\exploreint{1}

\exploreint{2}

\exploreint{3}

\end{document}

image.png

image.png

发布
问题