雾月
雾月
这家伙很懒,什么也没写!

注册于 3年前

回答
184
文章
2
关注者
19

使用 ctex 宏包或其文档类以后,不要再使用 titlesec 宏包,直接使用 heading 选项或者 ctexheading 宏包。ctexheading 宏包基本有与 titlesec 宏包等价的设置方式,并且接口更加友好。

  1. \addcontentsline 前需使用 \phantomsection 以正确设置超链接位置。
  2. 使用 heading 选项后,可以直接设置 \ctex{.../numbering=false} 不对标题编号,但仍输出至目录,并正确设置超链接和书签。
\documentclass[12pt,a4paper]{article}
\usepackage[UTF8,heading]{ctex}
\usepackage{geometry}
\geometry{a4paper,left=3.18cm,right=3.18cm,top=2.54cm,bottom=2.54cm}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage[numbers,sort&compress]{natbib}
\usepackage{tabularx}
\usepackage{hyperref}
\usepackage{booktabs}
\usepackage{graphicx}
\usepackage{setspace}
\ctexset{section/format=\centering\fontsize{16pt}{19.2pt}\bfseries,section/aftername=\quad}
%\usepackage{titlesec}
%\titleformat{\section}{\centering\fontsize{16pt}{19.2pt} \bfseries}{\thesection}{1em}{}
\numberwithin{equation}{section}
\linespread{1.5}



\begin{document}

    \newpage
    \tableofcontents
    \newpage

    \section{背景介绍与研究现状}
    \newpage
    \section{平衡点的线性稳定性}
    \newpage
    \section{数值模拟}\label{sec6}
    \newpage
    \section{总结与讨论}\label{sec7}

    \newpage
    \phantomsection
    \addcontentsline{toc}{section}{参考文献}
    \begin{thebibliography}{99}
    \end{thebibliography}
    
    \clearpage
    %\setcounter{secnumdepth}{0}
    \ctexset{section/numbering=false}
    \section{致谢}
    %\addcontentsline{toc}{section}{致谢}
 谢谢谢谢谢
\end{document}

这可能是 XeLaTeX 下特有的 bug。
使用其它引擎编译即可,需修改代码。这里提供 LuaLaTeX 和 upLaTeX 的方法。另外在 upLaTeX 下需自行修改 jfm,否则标点符号仍然使用全宽标点。
image.png

%%--- LuaLaTeX
%%--- lualatex main.tex
\documentclass[12pt,tate]{ltjarticle}
\usepackage{luatexja-fontspec}
\setmainjfont[TateFeatures = {JFM={zh_CN/{kaiming,vert}}}]{SimSun}
\newjfontface\fangsong[TateFeatures = {JFM={zh_CN/{kaiming,vert}}}]{SimFang}
\linespread{1.3}\selectfont % 适配 ctex 的行间距
\Large\parindent=2\zw % 缩进
%%---

%%--- upLaTeX
%%--- ptex2pdf -u -l main.tex
%\documentclass[12pt]{utarticle}
%\usepackage{ctex}
%%---

\usepackage{lltjp-geometry} % 在 LuaLaTeX 和 upLaTeX 下,直排需使用这个宏包以适配 geometry
\usepackage[a4paper,margin=1in]{geometry}
\usepackage{jiazhu}
\jiazhuset{
format =\fangsong,
beforeskip =0.5em plus 0.2em minus 0.2em,
afterskip =0.5em plus 0.2em minus 0.2em}

\begin{document}
\Large

世祖光武皇帝讳秀,字文叔,\jiazhu{测礼“祖有功而宗有德”,光武中兴,故庙称世祖。谥法:“能绍前业曰光,克定祸乱曰武。”伏侯古今注曰:“秀之字曰茂。伯、仲、叔、季,兄弟之次。长兄伯升,次仲,故字文叔焉。”}南阳蔡阳人,\jiazhu{南阳,郡,今邓州县也。蔡阳,县,故城在今随州枣阳县西南。}高祖九世之孙也,出自景帝生长沙定王发。\jiazhu{长沙,郡,今潭州县也。}发生舂陵节侯买,\jiazhu{舂陵,乡名,本属零陵泠道县,在今永州唐兴县北,元帝时徙南阳,仍号舂陵,故城在今随州枣阳县东。事具宗室四王传。}买生郁林太守外,\jiazhu{郁林,郡,今贵州县。前书曰:“郡守,秦官。秩二千石。景帝更名太守。”}外生钜鹿都尉回,\jiazhu{钜鹿,郡,今邢州县也。前书曰:“都尉,本{郡尉},秦官也。掌佐守,典武职,秩比二千石。景帝更名都尉。”}回生南顿令钦,\jiazhu{南顿,县,属汝南郡,故城在今陈州项城县西。前书曰:“令、长,皆秦官也。万户以上为令,秩千石至六百石;不满万户为长,秩五百石至三百石。”}钦生光武。光武年九岁而孤,养于叔父良。

身长七尺三寸,美须眉,大口,隆准,日角。\jiazhu{隆,高也。许负云:“鼻头为准。”郑玄尚书中候注云:“日角谓庭中骨起,状如日。”}性勤于稼穑,\jiazhu{种曰稼,敛曰穑。}而兄伯升好侠养士,常非笑光武事田业,比之高祖兄仲。\jiazhu{仲,合阳侯喜也,能为产业。见前书。}王莽天凤中,\jiazhu{王莽始建国六年改为天凤。}乃之长安,受尚书,略通大义。\jiazhu{东观记曰:“受尚书于中大夫庐江许子威。资用乏,与同舍生韩子合钱买驴,令从者僦,以给诸公费。”}

莽末,天下连岁灾蝗,寇盗锋起。\jiazhu{言贼锋锐竞起。字或作“蜂”,谕多也。}地皇三年,\jiazhu{天凤六年改为地皇。}南阳荒饥,\jiazhu{《韩诗外传》曰:“一谷不升曰歉,二谷不升曰饥,三谷不升曰馑,四谷不升曰荒,五谷不升曰大侵。”}诸家宾客多为小盗。光武避吏新野,\jiazhu{新野属南阳郡,今邓州县。《续汉书》曰:“伯升宾客劫人,上避吏于新野邓晨家。”}因卖谷于宛。\jiazhu{《东观记》曰:“时南阳旱饥,而上田独收。”宛,县,属南阳郡,故城今邓州南阳县也。}宛人李通等以图谶说光武云:“刘氏复起,李氏为辅。”\jiazhu{图,《河图》也。谶,符命之书。谶,验也。言为王者受命之征验也。《易·坤灵图》曰:“汉之臣李阳也。”}光武初不敢当,然独念兄伯升素结轻客,必举大事,且王莽败亡已兆,天下方乱,遂与定谋,于是乃市兵弩。十月,与李通从弟轶等起于宛,时年二十八。
\end{document}

jiazhu 宏包版本太旧。
使用这一个版本:jiazhu.sty

使用 upLaTeX 或 pLaTeX-ng 编译,不能使用其它引擎
image.png

\documentclass[tikz,border=5pt,dvipdfmx]{standalone}
\usepackage{ctex}
\newcommand\nodebox[2][5\ccwd]{\hbox{\vbox{\parindent=0pt \linespread{1}\selectfont
  \setlength\hsize{#1}\tate #2}}}
\usetikzlibrary{arrows.meta,calc,positioning}
\tikzstyle{every node}=[font=\small]
\tikzset{>={Stealth[scale=1.1]}}
\tikzset{NR/.style={rectangle,draw,minimum height=0.5cm,inner ysep
=2pt,inner xsep=5pt,text=black,align=center,font=\linespread{1}\small}}
\begin{document}
\begin{tikzpicture}[node distance=1cm,cyan]
\node[NR,text width=5em](a){导数的概念及其意义};
\node[NR,below=of a,xshift=-0.7cm,align=left](a1){\tate 导数的概念};
\node[NR,below=of a,xshift=0.7cm,align=left](a2){\nodebox[6\ccwd]{基本初等函数的导数公式}};
\path(a.south)--++(0,-0.5cm)coordinate(x);
\draw(a.south)--(x)-|(a1.north);
\draw(a.south)--(x)-|(a2.north);
\end{tikzpicture}

\end{document}

upLaTeX 编译:

uplatex main.tex % 生成 dvi(main.dvi)
dvipdfmx main.dvi % 生成 pdf(main.pdf)

pLaTeX-ng 编译:

platex-ng main.tex % 生成 dvi(main.dvi)
dvipdfmx main.dvi % 生成 pdf(main.pdf),这一步必须使用 dvipdfmx,默认生成的 pdf 仍保留空白边距

(1)插入垂直间距 -1em。(2)这是使用垂直字体导致的,不能正确计算盒子的宽度,根本原因是目前 xetex 没有垂直排版的能力,只能靠旋转来实现。要使用垂直排版,最好使用 upLaTeX、pLaTeX-ng,或 ConTeXt MKXL(LuaMetaTeX)。(3)修改 \lineskiplimit\lineskip

\documentclass{ctexart}
\usepackage{graphicx}
\setCJKmainfont{SimSun}
\setCJKfamilyfont{songvert}[RawFeature={vertical:+vert}]{SimSun}
\newcommand*\CJKmovesymbol[1]{\raise.7em\hbox{#1}}
\newcommand*\CJKmove{
\let\CJKsymbol\CJKmovesymbol
\let\CJKpunctsymbol\CJKsymbol}
\usepackage{varwidth}
\newcommand{\shupai}[1]{\rotatebox{-90}{%
\begin{varwidth}{\textwidth}
\CJKfamily{songvert}
\lineskip=-3pt
\lineskiplimit=1pt
\CJKmove
#1\end{varwidth}}}
\newcommand{\SHUPAI}[1]{\rotatebox{-90}{%
\CJKfamily{songvert}%
\CJKmove
#1}}

\begin{document}
上文上文上文上文上文上文上文上文上文上文

\vspace*{-1em}\fbox{\shupai{文本框框\\测试}}

下文下文下文下文下文下文下文下文

\vspace*{-1em}\fbox{\SHUPAI{文本框框}}

测试测试测试测试测试测试测试测试测试测试测试测试
\end{document}

image.png

你可以定义一个近似 dash 命令,

\ExplSyntaxOn
\NewDocumentCommand \approxhdashrule { O{0pt} m m m }
  {
    \hbox_to_wd:nn {#2}
      {
        \int_set:Nn \l_tmpa_int 
          { 
            2 * \int_div_round:nn { \int_value:w \tex_dimexpr:D #2 } 
                                  { 2 * \int_value:w \tex_dimexpr:D #4 } + 1 
          }
        \dim_set:Nn \l_tmpa_dim { \dim_eval:n {#2} / \l_tmpa_int }
        \hdashrule [#1] {#2} {#3} { \l_tmpa_dim }
        \hbox_overlap_left:n { \rule [#1] { \l_tmpa_dim } {#3} }
      }
  }
\ExplSyntaxOff

在尾部附加了一个 \rule。不过只能使用单个长度,不能使用不等长的(比如 1mm 2mm 1mm)。
由于在盒子中,自带了一个组,所以无需显式使用 \begingroup ... \endgroup

image.png

\documentclass{article}
\usepackage{dashrule}
\setlength{\parindent}{0mm}
\begin{document}
\rule[0mm]{\linewidth}{1mm}
\hdashrule[0.5ex]{\linewidth}{0.5pt}{5mm}%

\hdashrule[0.5ex]{\linewidth}{0.5pt}{3mm}%

\hdashrule[0.5ex]{\linewidth}{0.5pt}{2mm}%

\hdashrule[0.5ex]{\linewidth}{0.5pt}{1mm}%

approximate:

\ExplSyntaxOn
\NewDocumentCommand \approxhdashrule { O{0pt} m m m }
  {
    \hbox_to_wd:nn {#2}
      {
        \int_set:Nn \l_tmpa_int 
          { 
            2 * \int_div_round:nn { \int_value:w \tex_dimexpr:D #2 } 
                                  { 2 * \int_value:w \tex_dimexpr:D #4 } + 1 
          }
        \dim_set:Nn \l_tmpa_dim { \dim_eval:n {#2} / \l_tmpa_int }
        \hdashrule [#1] {#2} {#3} { \l_tmpa_dim }
        \hbox_overlap_left:n { \rule [#1] { \l_tmpa_dim } {#3} }
      }
  }
\ExplSyntaxOff

\rule[0mm]{\linewidth}{1mm}

\approxhdashrule[0.5ex]{\linewidth}{0.5pt}{5mm}%

\approxhdashrule[0.5ex]{\linewidth}{0.5pt}{3mm}%

\approxhdashrule[0.5ex]{\linewidth}{0.5pt}{2mm}%

\approxhdashrule[0.5ex]{\linewidth}{0.5pt}{1mm}%

\end{document}

你引入了 paralist 宏包,它不能和 enumitem 同时使用。你把 paralist 那段代码全删掉。
enumitemnosep 选项可以清除前后空白。
然后,用 \setlist[enumerate,2]{label=(\arabic*)} 统一设置二级列表的 label,或者写 \begin{enumerate}[label=(\arabic*)]

\documentclass[11pt,a4paper]{article} 
\pagestyle{plain}

\usepackage{ctex}            % 显示中文宏包
%\usepackage{snotez}            % 侧边标注宏包

\usepackage{marginnote}        % 侧边标注宏包
\usepackage{ragged2e}
\renewcommand{\marginfont}{\small\kaishu}
\renewcommand*{\raggedrightmarginnote}{}
\renewcommand*{\raggedleftmarginnote}{}



\usepackage{geometry}
%\geometry{left=2.8cm,right=1.8cm,top=2.8cm,bottom=2.8cm}
\geometry{inner=2cm,outer=2cm,bottom=1.5cm,top=2cm,marginparwidth=4.5cm,marginparsep=0.5cm,includemp}

\usepackage[dvipsnames]{xcolor}

\usepackage{fontspec}
\setmainfont{Times New Roman}

% \linespread{1.25}                % 设置整体行距
\usepackage{setspace}            % 行距设置宏包

\usepackage{tocloft}            % 目录格式宏包
\renewcommand\cfttoctitlefont{\hfill\Large\sffamily\bfseries\color{BrickRed}\centering}
\renewcommand\cftaftertoctitle{\hfill}
\setlength\cftbeforetoctitleskip{2ex}
\setlength\cftaftertoctitleskip{2ex}

%\setcounter{tocdepth}{1}

\usepackage{titlesec}            % 目录宏包
\usepackage{titletoc}            % 目录宏包
%\usepackage[toc]{multitoc}        % 多级目录

\usepackage{enumerate}
\usepackage{enumitem}
%\renewcommand{\labelenumii}{(\ensuremath{\arabic{enumii}})}
\setlist[enumerate,2]{label=(\arabic*)}%%% 正确的做法
%\renewcommand{\labelenumi}{(\ensuremath{\theenumi})}
\setlist[enumerate,1]{label=\arabic*.}%%% 正确的做法
%\setlist[enumerate]{listparindent=\parindent}
\usepackage{booktabs}
\usepackage{array}
\usepackage{tabularx}
\usepackage{tabu}
\usepackage{makecell}
\usepackage{longtable,booktabs}
\usepackage{ltxtable}

%%%% 解决Itemize和Enumerate的item之间行距过大的问题
\setlist{nosep}%%% 正确的做法
%\usepackage{paralist}
%\let\itemize\compactitem
%\let\enditemize\endcompactitem
%\let\enumerate\compactenum
%\let\endenumerate\endcompactenum
%\let\description\compactdesc
%\let\enddescription\endcompactdesc
%%%% ---------

\usepackage{fancyhdr}

\setlength{\parindent}{0pt} % 放在段首,之后的所有段落都将取消首行缩进
\setlength{\parskip}{0.6\baselineskip} %设置段落间距


%\author{My Name} 
\date{April, 2022}
\title{一级建造师执业资格考试市政务实 \\
~      \\  % 插入空行
~      \\
历年真题笔记} 

\begin{document} 
    
    \maketitle            % 生成标题
    
    \thispagestyle{empty}    % 当前页无页眉页脚
    
    \newpage
    
    \tableofcontents

%    \titlecontents{section}
%                  [3cm]
%                  {\bf \large}%
%                  {\contentslabel{2.5em}}%
%                  {}%
%                  {\titlerule*[0.5pc]{$\cdot$}\contentspage\hspace*{3cm}}

    \titlecontents{section}
                  [3em]
                  {\vspace{3mm}\bf \large}
                  {\contentslabel{2em}}
                  {}
                  {\titlerule*[0.5pc]{$\cdot$}\contentspage\hspace*{0em}}
                
    \titlecontents{subsection}
                  [5em]
                  {\vspace{3mm}}
                  {\contentslabel{2em}}
                  {}
                  {\titlerule*[0.5pc]{$\cdot$}\contentspage\hspace*{0em}}

    \titlecontents{subsubsection}
                  [8em]
                  {\vspace{2.5mm}}
                  {\contentslabel{3em}}
                    {}
                  {\titlerule*[0.5pc]{$\cdot$}\contentspage\hspace*{0em}}

    \thispagestyle{empty}
    
    \newpage    %第一节

    \section{20220330真题解析桥梁} 
    
%    \setlength{\parskip}{0.6\baselineskip} %设置段落间距
    
    \setcounter{page}{1}
    
%    \begin{spacing}{1.25}
        
    某桥梁工程项目的下部结构已全部完成,受政府指令工期的影响,业主将尚未施工的上部结构分成A、B二个标段,将B段重新招标。桥面宽度17.5m,桥下净空6m,上部结构设计为钢筋混凝土预应力现浇箱梁(三跨一联),共40联。
    
    原施工单位甲公司承担A标段,该标段施工现场系既有废弃公路无需处理,满足支架法施工条件,甲公司按业主要求对原施工组织设计进行了重大变更调整;新中标的乙公司承担B标段,因B标施工现场地处闲置弃土场,地域宽广平坦,满足支架法施工部分条件,其中纵坡变化较大部分为跨越既有正在通行的高架桥段,新建桥下净空高度达13.3m(如图所示)。

    甲、乙两公司接受任务后立即组织力量展开了施工竞赛。甲公同利用既有公路作为支架基础,地基承载力符合要求。乙公司为赶工期,将原地面稍作整平后即展开支架搭设工作,很快进度超过甲公司。支架全部完成后,项目部组织了支架质量检查,并批准模板安装。模板安装完成后开始绑扎钢筋。指挥部检查中发现乙公司施工管理存在问题,下发了停工整改通知单。
    
%    \end{spacing}

    问题

\begin{enumerate} % 阿拉伯数字编号
    
\item 原施工组织设计中主要施工资源配置有重大变更调整,项目部应如何处理?重新开工之前技术负责人和安全负责人应完成什么工作?
\item 满足支架法施工的部分条件指的是什么?
\item B标支架搭设场地是否满足支架的地基承载力?应如何处置?
\item 支架搭设前技术负责人应做好哪些工作?桥下净高13.3m部分如何办理手续?
\item 支架搭设完成和模板安装后用什么方法解决变形问题?支架拼装间隙和地基沉降在桥梁建设中属哪一类变形?
\item 跨越既有高架部分的桥梁施工需到什么部门补充办理手续?

\end{enumerate}

\newpage

    回答\marginnote{基础知识 + 解题思路 }

\begin{enumerate}
    
\item 原施工组织设计中主要施工资源配置有重大变更调整,\marginnote{施工组织设计(变更)审批流程 \\
\\
技术负责人 / 安全技术交底、参与施工组织设计编制、校核 \\
\\
安全负责人 / 参与施工组织设计编制、校核 \\
\\
培训教育施工作业人员}
项目部应如何处理?重新开工之前技术负责人和安全负责人应完成什么工作?

\begin{enumerate}
    
\item 主要资源配置发生重大变更调整后,项名部应执行施工组织设计变更审批流程。\\
项目经理重新组织编制施工组织设计,提交施工单位技术负责人审核签字加盖公章,经总监理工程师审查签认后交由建设公司审核。
\item 重新开工前,项目技术负责人对全体施工人员做书面安全技术交底,留交底人、被交底人和专职安全员签字归档,过程中监督检查持续更新。
\item 安全负责人参与安全技术交底,对作业人员进行安全教育培训,检查安全保障工具。
技术负责人和安全负责人参与施工组织设计中的安全技术方案编制校核工作。

\end{enumerate}

\vspace{0.6em}
    
\item 满足支架法施工的部分条件指的是什么?\marginnote{市政工程施工特点,结合案例背景}

\begin{enumerate}
\item 施工现场地处闲置弃土场,干扰少,材料、工器具进出方便。
\item 地域宽广平坦,作业面大,施工操作方便。
\end{enumerate}

\vspace{0.6em}

\item B 标支架搭设场地是否满足支架的地基承载力?应如何处置?\marginnote{地基:平整坚实+排水良好 \\
    \\
    流程:压实平整 → 验算承载力 → 不满足换填加固 → 预压合格留记录归档 → 防排水 → 混凝土地块或钢板}

\begin{enumerate}
\item 不满足
\item 清理表层、平整场地、填充坑穴,分层碾压密实,校验地基承载力。
\item 如地基承载力不满足要求则换填加固,直至承载力合格。
\item 支架搭设前预压地基,验收合格留记录归档。
\item 支架地基设置防排水设施,冬季设置防冻胀措施。
\item 基础上安装钢板或混凝土垫块,增大支架受力面积。
\end{enumerate}

\end{enumerate}


\newpage


\end{document}

(1)这可能是一个 bug,见:https://github.com/CTeX-org/ctex-kit/issues/530,目前未解决。
(2)容易解决,但同样无法用于 amsmath 的某些环境,而且颜色的高度固定为普通文字那么高。

\documentclass[fontset=windows]{ctexart}
\usepackage{ulem}
\usepackage{xeCJKfntef}
\usepackage{xcolor}
\makeatletter
\newcommand{\hltext}[1]{\CJKunderanyline*{0.5ex}{\color{yellow}\rule{0.1pt}{2.5ex}}{#1}}
\newcommand\hlmath[1]{\mathpalette{\hlmath@aux}{#1}}
\def\hlmath@aux#1#2{\hbox{\hltext{\m@th$#1#2$}}}
\newcommand*\hl{\ifmmode\expandafter\hlmath\else\expandafter\hltext\fi}
\makeatother
\begin{document}
一般地,设$A$,$B$是两个非空数集,\hl{如果按某种对应关系{ }$f$,对于集合~$A$中的任意一
个数~$x$,在集合~$B$中都有唯一的数~$\displaystyle\int f(x)$和它对应},那么就称$f$为集合$A$到集
合$B$的一个函数,记作
\[ \hl{y=\int f(x),x\in A.}\quad f_{\hl{x}} \]
\end{document}

image.png

(1)添加 \leavevmode。(2)没办法。(3)模拟 amsmath 宏包的 \boxed
这种东西不适合用 LaTeX 制作。

缺陷:数学公式不能跨行,align 等对齐环境下存在问题,文字不能分页等问题。

\documentclass[fontset=windows]{ctexart}
\usepackage{amsmath,mathtools}
\usepackage{color}
\usepackage{linegoal}
\newbox\HighlightPiece 
\newdimen\FirstHeight
\newdimen\FirstDepth
\newdimen\LastHeight
\newdimen\LastDepth
\newdimen\TotalHeight
\newdimen\TotalDepth
\newdimen\LineIndent
\newdimen\LineGoal

\newif\ifOnePiece

\makeatletter
\newcommand\HLGetDimensions {% 
  \setbox\HighlightPiece\lastbox
  \unskip\unpenalty
  \ifdim\wd\HighlightPiece<\linewidth
  \global\OnePiecetrue
  \else
  \global\OnePiecefalse
  \fi 
  \ifOnePiece
  \else
  \global\LastHeight\ht\HighlightPiece
  \global\LastDepth\dp\HighlightPiece
  \loop % 
  \setbox\HighlightPiece\lastbox
  \unskip\unpenalty
  \ifvoid\HighlightPiece\else
  \ifdim\wd\HighlightPiece<\linewidth
   \global\FirstHeight\ht\HighlightPiece
   \global\FirstDepth\dp\HighlightPiece
  \fi
  \repeat
 \fi
}
\newcommand\Highlighttext [2][yellow]
 {%
   \leavevmode
   \LineGoal\linegoal   % http://ctan.org/pkg/linegoal
   \LineIndent=\dimexpr\linewidth-\LineGoal\relax
   \vbox{%
   \hfuzz\maxdimen
   \hangindent\LineIndent
   \hangafter\m@ne
   \noindent  #2\endgraf 
   \HLGetDimensions
   }%
   \ifOnePiece
     \begingroup \fboxsep\z@
     \colorbox{#1}{#2}%
     \endgroup
   \else
     \setbox\z@\vbox{%
      \hfuzz\maxdimen
      \hangindent\LineIndent
      \hangafter\m@ne
      \noindent #2\endgraf }%
  \TotalHeight\ht\z@
  \TotalDepth\dp\z@
  \advance\TotalHeight\TotalDepth
  \advance\TotalHeight-\FirstHeight
  \advance\TotalHeight-\FirstDepth
  \begingroup % et pas \color@begingroup, cf plus bas!
    \color{#1}%
    \rlap{\hbox{\vrule\@height\FirstHeight
        \@depth\FirstDepth
        \@width\LineGoal
}}%
    \setbox\z@\vbox{\moveleft\LineIndent
        \hbox{\vrule
        \@height\TotalHeight
        \@depth\z@
        \@width\linewidth
}}%
  \ht\z@\z@\dp\z@-\FirstDepth\wd\z@\z@
  \lower\FirstDepth\box\z@
  \endgroup % \color@endgroup fait basculer en mode vertical!!
   \mbox{}#2%
  \LineGoal\linegoal
  \rlap{\hbox{\begingroup\color{white}%
      \vrule\@height\LastHeight
         \@depth\LastDepth
         \@width\dimexpr\LineGoal+1pt\relax
      \endgroup}}% this 1pt could be a user hook dimen.
   \fi
}%
\newcommand\Highlight@dmath[2][yellow]{{\fboxsep=0pt\fboxrule=0pt\fcolorbox{#1}{#1}{\m@th$\displaystyle#2$}}}
\newcommand\Highlight{\ifmmode\expandafter\Highlight@dmath
  \else\expandafter\Highlighttext\fi}
\makeatother


\begin{document}

\Highlight{文字文字文字文字文字文字文字文文字文字文字文文字文字文字文字文字文字文,}文字文文字文

\Highlight{测试测试测试测$f(x)$试测试测试测试测试}测试
\[
\Highlight{\int f(x),x\in A}
\]

\begin{align}
a&=b \\
c&=d \\
k&=\Highlight{\int_a^c dx} \\
\Aboxed{k&=\int_a^c dx}
\end{align}

\end{document}

如果通栏的内容无需分页,使用 cuted 宏包提供的 strip 环境即可:

\documentclass[twocolumn]{ctexart}
\usepackage[margin = 1cm]{geometry}
\usepackage[most]{tcolorbox}
\usepackage{lipsum}

\usepackage{cuted}

\begin{document}
\lipsum[2]

%\onecolumn

\stripsep=-10pt plus12pt minus 2pt
\begin{strip}
\begin{center}
  \begin{tcolorbox}[width = 0.9\linewidth, colframe=black,boxrule = 0.5pt, colback = white,left = 1pt,top = 1pt,bottom = 1pt,right = 1pt]
    \lipsum[1]
  \end{tcolorbox}
\end{center}
\end{strip}
\leavevmode %如果后面没有文字,必须使用,否则可能出错
\end{document}

image.png

如果要分页,则只能使用 multicol 宏包,浮动体使用 H,或者带星号的 figure* 等,目前没有其它办法。

不难实现,只需:

\renewcommand*\@LN@depthbox{%
  \dp\@tempboxa=\@tempdima
  \nointerlineskip \box\@tempboxa \kern-\@tempdima}

实际上原来的这个命令正是为了行号能对齐基线的。

为了显示效果,你可能还需要改改 \rule 的移动距离和 \lineskip

\renewcommand\makeLineNumber
  {%\tikz[remember picture,overlay,baseline=0.3em]
   % \draw[red!20] (0,0em) -- (\textwidth,0em);
    \mbox{\rule[-0.2em]{\textwidth}{0.2pt}}
  }
\AtBeginDocument{%
  \lineskiplimit=4pt
  \lineskip=8pt
}

image.png

完整代码:

\documentclass{ctexart}
\usepackage{mathtools}
\usepackage[mathlines,displaymath]{lineno}
\usepackage{tikz}

\usepackage{zhlipsum}

\usepackage{etoolbox}        
%% Patch 'normal' math environments:
\newcommand*\linenomathpatch[1]{%
  \cspreto{#1}{\linenomath}%
  \cspreto{#1*}{\linenomath}%
  \csappto{end#1}{\endlinenomath}%
  \csappto{end#1*}{\endlinenomath}%
}
%% Patch AMS math environments:
\newcommand*\linenomathpatchAMS[1]{%
  \cspreto{#1}{\linenomathAMS}%
  \cspreto{#1*}{\linenomathAMS}%
  \csappto{end#1}{\endlinenomath}%
  \csappto{end#1*}{\endlinenomath}%
}

%% Definition of \linenomathAMS depends on whether the mathlines option is provided
\expandafter\ifx\linenomath\linenomathWithnumbers
  \let\linenomathAMS\linenomathWithnumbers
  %% The following line gets rid of an extra line numbers at the bottom:
  \patchcmd\linenomathAMS{\advance\postdisplaypenalty\linenopenalty}{}{}{}
\else
  \let\linenomathAMS\linenomathNonumbers
\fi

\linenomathpatch{equation}
\linenomathpatchAMS{gather}
\linenomathpatchAMS{multline}
\linenomathpatchAMS{align}
\linenomathpatchAMS{alignat}
\linenomathpatchAMS{flalign}

% Disable line numbering during measurement step of multline
\makeatletter
\patchcmd{\mmeasure@}{\measuring@true}{
  \measuring@true
  \ifnum-\linenopenaltypar>\interdisplaylinepenalty
    \advance\interdisplaylinepenalty-\linenopenalty
  \fi
  }{}{}
\def\@LN@depthbox{%
  \dp\@tempboxa=\@tempdima
  \nointerlineskip \box\@tempboxa \kern-\@tempdima}
\renewcommand\makeLineNumber
  {%\tikz[remember picture,overlay,baseline=0.3em]
   % \draw[red!20] (0,0em) -- (\textwidth,0em);
    \mbox{\rule[-0.2em]{\textwidth}{0.2pt}}
  }
\AtBeginDocument{
\lineskiplimit=4pt
\lineskip=8pt
}
\makeatother
\begin{document}

\linenumbers
文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
文字文字文字文字文字文字文字文$\dfrac{1}{2}$文字文字文
文字文字文字文字文字文字文字文字文字文字文文
%\begin{linenomath}
\begin{align}
a+b\\
\int c+d
\end{align}
%\end{linenomath}
字文字文字文字文字文字文字文字文字
$\begin{dcases}
  a+b\\ f+r\\ go
\end{dcases}$
\begin{enumerate}
  \item 测试测试测试测试测试测试测试测试$\displaystyle\int$
  \item 测试测试测试测试测试测试测试测试
\end{enumerate}
行间公式块
\[
\begin{dcases}
x\\
-x
\end{dcases}
\]
文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本文本
%\nolinenumbers
\end{document}

通过修改 \@LN@depthbox 中的 \kern,你可以将行号放置于任意处。
比如:

\def\@LN@depthbox{%
  \dp\@tempboxa=\@tempdima
  \nointerlineskip \kern-.3\@tempdima \box\@tempboxa \kern-.7\@tempdima}

这是由于你用了 \mbox{} 制造了一个空行。行间距为 \baselineskip。设置 before=\vspace{-\baselineskip} 即可。

\documentclass{ctexart}
\usepackage{graphicx}
\usepackage{caption}
\usepackage{enumitem}
\usepackage{enumitem}
\setenumerate[1]{label={\sf\arabic*}.,labelwidth=1em,labelsep=0.2em,leftmargin=*,itemsep=0pt,partopsep=0pt,parsep=\parskip,topsep=0pt}
\usepackage{wrapfig2}
\begin{document}
测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试
\WFclear
\begin{wrapfigure}[7]{r}
\includegraphics[scale=0.3]{example-image-a}
\end{wrapfigure}
\mbox{}
\begin{enumerate}[before=\vspace{-\baselineskip}]
\item 字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文
\item 字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
\end{enumerate}
\end{document}

image.png

与缩进相关的环境和命令基本上都是使用 trivlistlist 环境(list 也使用 trivlist 环境)制作的。包括但不限于 theorem、changepage 宏包、itemize、description 等。你用 changepage,自定义环境等还不如直接使用 list 环境来定义,而且 list 环境已经给你做好了嵌套使用所需的准备工作。

trivlistlist 环境使用 \hangindent\hangafter 等 primitive 来制作,这意味着由它们定义的环境和命令无法与其它使用 \hangindent\hangafter\parshape primitive 定义的环境和命令共同使用,包括但不限于图文绕排、lettrine(首字下沉)等。这是 LaTeX 固有的缺陷。要么不同时使用,要么用 ConTeXt。

回到这个问题上来,adjustwidth 环境不是默认从新的一行开始,而是只能从新的一行开始,所有的 trivlist 环境都是如此,根本原因是上述 primitive 只能从新的一行或一段开始生效。

在只包含正常文字的情况下,两基线间的距离为 \baselineskip

你可以把文字放在一个盒子中,以测量其长度,或者使用 \settowidth{dim register}{content}

如下代码支持 text\hang{...\hang{...}...},基本实现了原始需要,但是,编译次数至少为:嵌套次数+1。比如上述 \hang 中嵌套了一个 \hang,需要至少编译 3 次。不支持多栏。

若要在任意位置开始,需显示地给出 \indentstart 以标明起始位置,见最后一例。

\documentclass{ctexart}
\usepackage[a4paper,includeheadfoot,margin=1.98cm]{geometry}

\usepackage{changepage}
\usepackage{zref,zref-savepos,zref-abspos}
\makeatletter
\newdimen\@autoindentsuppshift
\newdimen\@autoindenttrueyshift
\newdimen\@autoindentxshift
\newdimen\@autoindentyshift
\newcount\@autoindentdepth
\newcount\@autoindentcount
\zref@newlist{autoindent@info}
\zref@newprop{lastyshift}[0pt]{0pt}
\zref@newprop{yshift}[0pt]{0pt}
\zref@addprops{autoindent@info}{lastyshift,yshift}
% \def\@autoindent@strut{\hb@xt@\z@{\hss
%   \vrule\@width\z@\@depth\dimexpr -\zref@getcurrent{yshift}+\f@size\p@\relax}}
\def\@autoindent@strut{}
\def\indentstart{\leavevmode
  \@namedef{autoindent@record@\the\numexpr\@autoindentcount+1}{}%
  \zsavepos{autoindent@labelpos@\the\numexpr\@autoindentcount+1@0}}
\def\@autoindent@startposx{\zref@ifrefundefined
  {autoindent@labelpos@\the\@autoindentcount @0}
  {\zref@absposx{\@autoindent@label}{body}{left}}
  {\zposx{autoindent@labelpos@\the\@autoindentcount @0}}}
\def\@autoindent@info{autoindent@info@\the\@autoindentcount @\the\@autoindentdepth}
\def\@autoindent@hang{autoindent@hangpos@\the\@autoindentcount @\the\@autoindentdepth}
\def\@autoindent@label{autoindent@labelpos@\the\@autoindentcount @\the\@autoindentdepth}
\def\@autoindent@savelabelpos{\advance\@autoindentdepth\@ne
  \zsavepos{\@autoindent@label}}
\def\@autoindent@savehangpos{\zsavepos{\@autoindent@hang}}
\def\@autoindent@labelposx{\zposx{\@autoindent@label}}
\def\@autoindent@labelposy{\zposy{\@autoindent@label}}
\def\@autoindent@hangposx{\zposx{\@autoindent@hang}}
\def\@autoindent@hangposy{\zposy{\@autoindent@hang}}

\newenvironment{autoindent}
  {\ifdim\@autoindentsuppshift=\z@ \global\advance\@autoindentcount\@ne\fi 
    \@autoindent@savelabelpos \leavevmode 
    \setlength\@autoindentxshift{\dimexpr
      \@autoindent@labelposx sp -
      \@autoindent@startposx sp - 
      \@autoindentsuppshift}%
    \advance\@autoindentsuppshift\@autoindentxshift
    \ifnum\zref@extract{\@autoindent@label}{abspage}
      =\zref@extract{\@autoindent@hang}{abspage}
      \setlength\@autoindentyshift{\dimexpr
        \@autoindent@hangposy sp - \@autoindent@labelposy sp}%
      \ifdim\@autoindentyshift=\z@ 
        \ifdim\@autoindent@hangposy sp>\z@ 
          \zref@ifrefundefined{\@autoindent@info}
            {\zref@setcurrent{yshift}{0pt}}
            {\ifdim\zref@extract{\@autoindent@info}{yshift}=\z@ 
                \zref@setcurrent{yshift}{\the\dimexpr
                  \zref@extract{\@autoindent@info}{lastyshift}}%
              \else
                \zref@setcurrent{yshift}{\the\dimexpr
                  \zref@extract{\@autoindent@info}{yshift}}%
              \fi}
        \else 
          \zref@setcurrent{yshift}{0pt}%
        \fi 
      \else
        \ifdim\zref@extract{\@autoindent@info}{lastyshift}=\@autoindentyshift
          \ifdim\zref@extract{\@autoindent@info}{lastyshift}=
            \zref@extract{\@autoindent@info}{yshift}
            \zref@setcurrent{yshift}{\the\dimexpr\@autoindentyshift}
          \else
            \zref@setcurrent{yshift}{\the\dimexpr
              \zref@extract{\@autoindent@info}{lastyshift}+
              \zref@extract{\@autoindent@info}{yshift}}%
          \fi
        \else 
          \zref@setcurrent{yshift}{\the\dimexpr\@autoindentyshift}%
        \fi
      \fi 
    \else 
      \zref@setcurrent{yshift}{0pt}%
    \fi
    \zref@setcurrent{lastyshift}{\zref@extract{\@autoindent@info}{yshift}}%
    \zref@labelbylist{\@autoindent@info}{autoindent@info}%
    \setlength\@autoindenttrueyshift{\zref@getcurrent{yshift}}%
    \vspace*{\@autoindenttrueyshift}%
    \begin{adjustwidth}{\@autoindentxshift}{\z@}\leavevmode
      \@autoindent@savehangpos \@autoindent@strut \ignorespaces}
  {\end{adjustwidth}}
\newcommand\hang[1]{\begin{autoindent}#1\end{autoindent}}


\newenvironment{autoindent*}[1]{\leavevmode\setbox0\hbox{#1}%
  \ifnum\@autoindentdepth=\z@ \setlength\@autoindentxshift{\dimexpr\parindent+\wd0}%
  \else \setlength\@autoindentxshift{\wd0}%
  \fi
  \setlength\@autoindentyshift{-\baselineskip}%
  \advance\@autoindentdepth\@ne
  \unhbox0
  \nobreak\vspace*{\@autoindentyshift}%
  \begin{adjustwidth}{\@autoindentxshift}{0pt}\ignorespaces}
 {\end{adjustwidth}}

\makeatletter

\begin{document}

\begin{autoindent*}{第一层}
试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试\\
\begin{autoindent*}{第二层}
试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试\\
\begin{autoindent*}{第三层}
试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试
\end{autoindent*}
\end{autoindent*}
\end{autoindent*}

第一层\begin{autoindent}
试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测测试测试测试测试测%
\begin{autoindent}
试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试%
\begin{autoindent}
试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试%
\end{autoindent}
\end{autoindent}
\end{autoindent}

第一层\hang{试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测测试测试测试测试测\hang{试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试\hang{试测试测试测试测试测试测试测试测试测试测试测试测试\hang{测试试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测}}}}

测试 $\displaystyle\int_{\sum}^{\prod}$ 测试\hang{试测试 $\displaystyle\int_{\sum}^{\prod}$ 测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测 $\displaystyle\int_{\sum}^{\prod}$ 试测\hang{试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试}}

\begin{center}
\begin{minipage}{.8\textwidth}
\indentstart 第一层\hang{试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测测试测试测试测试测\hang{试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试\hang{试测试测试测试测试测试测试测试测试测试测试测试测试}}}
\end{minipage}
\end{center}

\end{document}

image.png

核心功能是标记在页眉处出现的项。

\protected\def\markcontext#1#2{%
  \begingroup
    \let\label\relax \let\index\relax \let\glossary\relax
    \unrestored@protected@xdef\@themark {#2}%
    \@temptokena \expandafter{\@themark}%
    \marks#1{\the\@temptokena}%
  \endgroup
  \if@nobreak\ifvmode\nobreak\fi\fi}

\ExplSyntaxOn
\cs_new:Npn \@removetl #1#2 { \tl_range:Nnn #1 { \tl_count:o {#2} + 1 }{ -1 } }
\ExplSyntaxOff

\def\@headtext{}
\newmarks\@headmark
\newmarks\@pinyinmark
\providecommand\lettrine[3][]{\textbf{#2}#3}
\protected\def\dictitem#1#2{\lettrine{#1}{[#2]}\g@addto@macro\@headtext{{#1}}%
  \markcontext\@headmark{\@headtext}%
  \markcontext\@pinyinmark{#2}}

\def\@headoddleft{\thepage\quad
  \botmarks\@headmark\quad
  \firstmarks\@pinyinmark --\botmarks\@pinyinmark
  \xdef\@headtext{\@removetl\@headtext{\botmarks\@headmark}}}
\def\@headevenright{\botmarks\@headmark\quad
  \firstmarks\@pinyinmark --\botmarks\@pinyinmark
  \quad\thepage
  \xdef\@headtext{\@removetl\@headtext{\botmarks\@headmark}}}

这一部分无需加载任何宏包。

这里定义了一个 \@removetl,目的是当存储的页眉项与真正出现在页眉中的项不同时,需要保存未真正出现在页眉中的项,否则下一页页眉将损失这些项。

之所以会出现存储的页眉项与真正出现在页眉中的项不同的情况,是因为 TeX 在 shipout 之前就已经执行了存储功能的那部分宏,此时 TeX 还未决定哪些内容输出至当前页。

至于使用 titleps 还是 fancyhdr 是无关紧要的。

\documentclass[twoside]{article}

\makeatletter
\protected\def\markcontext#1#2{%
  \begingroup
    \let\label\relax \let\index\relax \let\glossary\relax
    \unrestored@protected@xdef\@themark {#2}%
    \@temptokena \expandafter{\@themark}%
    \marks#1{\the\@temptokena}%
  \endgroup
  \if@nobreak\ifvmode\nobreak\fi\fi}

\ExplSyntaxOn
\cs_new:Npn \@removetl #1#2 { \tl_range:Nnn #1 { \tl_count:o {#2} + 1 }{ -1 } }
\ExplSyntaxOff

\def\@headtext{}
\newmarks\@headmark
\newmarks\@pinyinmark
\providecommand\lettrine[3][]{\textbf{#2}#3}
\protected\def\dictitem#1#2{\lettrine{#1}{[#2]}\g@addto@macro\@headtext{{#1}}%
  \markcontext\@headmark{\@headtext}%
  \markcontext\@pinyinmark{#2}}

\def\@headoddleft{\thepage\quad
  \botmarks\@headmark\quad
  \firstmarks\@pinyinmark --\botmarks\@pinyinmark
  \xdef\@headtext{\@removetl\@headtext{\botmarks\@headmark}}}
\def\@headevenright{\botmarks\@headmark\quad
  \firstmarks\@pinyinmark --\botmarks\@pinyinmark
  \quad\thepage
  \xdef\@headtext{\@removetl\@headtext{\botmarks\@headmark}}}

\usepackage{ctex}
\usepackage{xpinyin}
\usepackage[a5paper,includeheadfoot,margin=1cm,headsep=10pt]{geometry}
\usepackage{lettrine}
\usepackage{zhlipsum}


%% titleps
\usepackage{titleps}
\newpagestyle{dict}{
  \setheadrule{0.4pt}
  \sethead[][][\@headevenright]{\@headoddleft}{}{}
  \setfoot{}{}{}}

%% fancyhdr
%\usepackage{fancyhdr}
%\fancypagestyle{dict}{
%  \def\headrulewidth{0.4pt}
%  \fancyfoot{}
%  \fancyhead[OL]{\@headoddleft}
%  \fancyhead[ER]{\@headevenright}}

\makeatother

\pagestyle{dict}

\begin{document}

\dictitem{哥}{\pinyin{ge1}}\zhlipsum[3][name=zhufu]

\dictitem{歌}{\pinyin{ge1}}\zhlipsum[6][name=zhufu]

\dictitem{割}{\pinyin{ge1}}\zhlipsum[8][name=zhufu]

\dictitem{革}{\pinyin{ge2}}\zhlipsum[9][name=zhufu]

\dictitem{愅}{\pinyin{ge2}}\zhlipsum[12][name=zhufu]

\dictitem{鞈}{\pinyin{ge2}}\zhlipsum[14][name=zhufu]

\dictitem{閤}{\pinyin{ge2}}\zhlipsum[14][name=zhufu]

\dictitem{蛤}{\pinyin{ge2}}\zhlipsum[15][name=zhufu]

\dictitem{韐}{\pinyin{ge2}}\zhlipsum[16][name=zhufu]

\dictitem{阁}{\pinyin{ge2}}\zhlipsum[8][name=zhufu]

\dictitem{格}{\pinyin{ge2}}\zhlipsum[10][name=zhufu]

\end{document}

image.png

发布
问题