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

注册于 4年前

回答
219
文章
2
关注者
23

如果通栏的内容无需分页,使用 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

首先你需要打一个 patch:

\makeatletter
\protected\def\makeparacolrule#1{\def\@pcolmakeparacolrule##1##2{\hb@xt@##2{\hss#1\hss}}}
\makeparacolrule{\vrule\@height#1\@width#2} % 默认, #1:=height, #2:=width
\def\pcol@buildcolseprule#1#2#3#4{%
  \@tempdima#1\relax \dimen@#4\relax
  \let\pcol@bg@from#2\relax \let\pcol@bg@to#3\relax
  \setbox\pcol@tempboxa\vbox{}\setbox\@tempboxa\vbox{}%
  \let\@elt\pcol@buildcselt@S \pcol@sptextlist
  \@tempdimb\z@ \let\@elt\pcol@buildcselt \pcol@sptextlist
  \let\@elt\relax \advance\@tempdima-\@tempdimb
  \ifdim\@tempdima>\z@
    \setbox\pcol@tempboxa\vbox{\unvbox\pcol@tempboxa
      \nointerlineskip
      \vbox{\@pcolmakeparacolrule{\@tempdima}{\columnseprule}\vss}}%
    \setbox\@tempboxa\vbox{\unvbox\@tempboxa
      \let\@elt\relax
      \edef\pcol@bg@columntop{\number\@tempdimb sp}%
      \edef\pcol@bg@columnheight{%
        \@elt{\number\@tempdima sp}\@elt{\number\dimen@ sp}}%
      \pcol@bg@paintcolumns}%
  \fi}
\def\pcol@buildcselt#1#2{%
  \@tempdimc#1sp \advance\@tempdimc-\@tempdimb
  \setbox\pcol@tempboxa\vbox{\unvbox\pcol@tempboxa
    \ifdim\@tempdimc>\z@
      \nointerlineskip
      \vbox{\@pcolmakeparacolrule{\@tempdimc}{\columnseprule}\vss}%
    \fi
    \vskip#2sp}%
  \setbox\@tempboxa\vbox{\unvbox\@tempboxa
    \let\@elt\relax
    \edef\pcol@bg@columntop{\number\@tempdimb sp}%
    \edef\pcol@bg@columnheight{\@elt{\number\@tempdimc sp}}%
    \ifdim\@tempdimc>\z@ \pcol@bg@paintcolumns \fi
    \def\pcol@bg@spanningtop{\@elt{#1sp}}%
    \advance\@tempdima-#1sp\relax \advance\@tempdima-#2sp\relax
    \advance\dimen@\@tempdima
    \edef\pcol@bg@spanningheight{\@elt{#2sp}%
      \ifdim\@tempdima>\z@\else \@elt{\number\dimen@ sp}\fi}%
    \pcol@bg@paintbox{s}}%
  \@tempdimb#1sp \advance\@tempdimb#2sp\relax}
\makeatother

或者直接 patch:

\usepackage{etoolbox}
\makeatletter
\protected\def\makeparacolrule#1{\def\@pcolmakeparacolrule##1##2{\hb@xt@##2{\hss#1\hss}}}
\makeparacolrule{\vrule\@height#1\@width#2} % 默认, #1:=height, #2:=width
\patchcmd\pcol@buildcolseprule{\hrule\@height\@tempdima\@width\columnseprule}
  {\nointerlineskip\vbox{\@pcolmakeparacolrule{\@tempdima}{\columnseprule}\vss}}{}{\err}
\patchcmd\pcol@buildcselt{\hrule\@height\@tempdimc\@width\columnseprule}
  {\nointerlineskip\vbox{\@pcolmakeparacolrule{\@tempdimc}{\columnseprule}\vss}}{}{\err}
\makeatother

它是把原来划线的命令替换为 \@pcolmakeparacolrule,然后可以用 \makeparacolrule{...} 来画自己的命令。

\usepackage{tikz}
% #1:=height, #2:=width
\makeparacolrule{\tikz\draw[dashed,line width=#2](0pt,0pt)--(0pt,#1);}

image.png

完整代码:

\documentclass{ctexart}
\usepackage{zhlipsum}
\usepackage{paracol}
\setlength{\columnseprule}{0.7pt}
\columnratio{0.6}

\usepackage{etoolbox}
\makeatletter
\protected\def\makeparacolrule#1{\def\@pcolmakeparacolrule##1##2{\hb@xt@##2{\hss#1\hss}}}
\makeparacolrule{\vrule\@height#1\@width#2} % 默认, #1:=height, #2:=width
\patchcmd\pcol@buildcolseprule{\hrule\@height\@tempdima\@width\columnseprule}
  {\nointerlineskip\vbox{\@pcolmakeparacolrule{\@tempdima}{\columnseprule}\vss}}{}{\err}
\patchcmd\pcol@buildcselt{\hrule\@height\@tempdimc\@width\columnseprule}
  {\nointerlineskip\vbox{\@pcolmakeparacolrule{\@tempdimc}{\columnseprule}\vss}}{}{\err}
\makeatother

\usepackage{tikz}

\begin{document}

\makeparacolrule{\tikz\draw[dashed,line width=#2](0pt,0pt)--(0pt,#1);}

\begin{paracol}{2}
\zhlipsum[1]
\switchcolumn
\zhlipsum[2]
\end{paracol}
\end{document}

\tableofcontents 前加上 \pagestyle{headings} 即可。

改成这样:

...
%
%\frontmatter

\cleardoublepage
\pagestyle{headings}
%正文目录
\tableofcontents
%插图目录
\listoffigures
%表格目录
\listoftables
...

\ExplSyntaxOn
\cs_new_protected_nopar:Npn \autoCenterstack #1
  {
    \group_begin:
    \dim_zero:N \l_tmpa_dim
    \tl_clear:N \l_tmpa_tl
    \seq_set_split:Nnn \l_tmpa_seq { \\ } { #1 }
    \seq_pop_right:NN \l_tmpa_seq \l_tmpb_tl
    \seq_map_inline:Nn \l_tmpa_seq
      {
        \hbox_set:Nn \l_tmpa_box {##1}
        \dim_compare:nNnT { \box_wd:N \l_tmpa_box } > \l_tmpa_dim
          { \dim_set:Nn \l_tmpa_dim { \box_wd:N \l_tmpa_box } }
        \tl_put_right:Nn \l_tmpa_tl { \makebox[\l_tmpa_dim][s]{##1} \\ }
      }
    \hbox_set:Nn \l_tmpa_box { \l_tmpb_tl }
    \dim_compare:nNnT { \box_wd:N \l_tmpa_box } > \l_tmpa_dim
      { \dim_set:Nn \l_tmpa_dim { \box_wd:N \l_tmpa_box } }
    \tl_put_right:Nx \l_tmpa_tl { \exp_not:N \makebox [\l_tmpa_dim] [s] { \exp_not:o \l_tmpb_tl } }
    \exp_args:No \Centerstack { \l_tmpa_tl }
    \group_end:
  }
\ExplSyntaxOff

基本思路是按 \\ 分割 tl,然后计算这些 tl 的构成的盒子的最大宽度,然后使用这个最大宽度。

如果要保留 \\ 前后的空格,将 \seq_set_split:Nnn 换成 \seq_set_split_keep_spaces:Nnn

\documentclass{ctexart}
\usepackage[usestackEOL]{stackengine}
\def\stacktype{L}
\strutlongstacks{T}
\begin{document}

\ExplSyntaxOn
\cs_new_protected_nopar:Npn \autoCenterstack #1
  {
    \group_begin:
    \dim_zero:N \l_tmpa_dim
    \tl_clear:N \l_tmpa_tl
    \seq_set_split:Nnn \l_tmpa_seq { \\ } { #1 }
    \seq_pop_right:NN \l_tmpa_seq \l_tmpb_tl
    \seq_map_inline:Nn \l_tmpa_seq
      {
        \hbox_set:Nn \l_tmpa_box {##1}
        \dim_compare:nNnT { \box_wd:N \l_tmpa_box } > \l_tmpa_dim
          { \dim_set:Nn \l_tmpa_dim { \box_wd:N \l_tmpa_box } }
        \tl_put_right:Nn \l_tmpa_tl { \makebox[\l_tmpa_dim][s]{##1} \\ }
      }
    \hbox_set:Nn \l_tmpa_box { \l_tmpb_tl }
    \dim_compare:nNnT { \box_wd:N \l_tmpa_box } > \l_tmpa_dim
      { \dim_set:Nn \l_tmpa_dim { \box_wd:N \l_tmpa_box } }
    \tl_put_right:Nx \l_tmpa_tl { \exp_not:N \makebox [\l_tmpa_dim] [s] { \exp_not:o \l_tmpb_tl } }
    \exp_args:No \Centerstack { \l_tmpa_tl }
    \group_end:
  }
\ExplSyntaxOff

{\Large
朋友!%
\autoCenterstack{诸葛八卦村\\ 地下长河\\ 芝堰水库}%
欢迎您去游览!
}

{\Large
朋友!%
\Centerstack{诸葛八卦村\\\makebox[5em][s]{地下长河}\\\makebox[5em][s]{芝堰水库}}%
欢迎您去游览!
}

\end{document}

image.png

这里再给出几种方法。

由于使用 \begin{<env>} 时,LaTeX 将会(在该命令执行的最末尾)展开 \csname <env>\endcsname
使用 \end{<env>},将会展开 \csname end<env>\endcsname,我们可以在 \<env> 中定义 \end<env>

\newcommand\weizi[2][c]{%
  \strcase{#1}
    {{c}{\def\endweizi{\end{minipage}\end{center}}%
         \begin{center}}
     {l}{\def\endweizi{\end{minipage}\end{flushleft}}%
         \begin{flushleft}}
     {r}{\def\endweizi{\end{minipage}\end{flushright}}%
         \begin{flushright}}}
     {}
     {\def\endweizi{\end{minipage}\end{center}}%
      \begin{center}}%
  \begin{minipage}{#2\textwidth}}

也就是根据相应的可选参数,定义对应的 \end<env>。这里的 \strcase 对应于 LaTeX3 的 \str_case_e:nnTF

% \strcase := LaTeX3 \str_case_e:nnTF
\expandafter\let\expandafter\strcase\csname str_case_e:nnTF\endcsname

使用方式为:

\begin{weizi}[c]{0.5}
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
\end{weizi}

这样的定义是可以嵌套使用的,因为每一对 \begin ... \end 都放在一个组中。

另一种方式涉及到 centerflushleftflushright 环境的实现。这三个环境都是使用 trivlist 环境实现的,它们的 \end<...> 都是 \endtrivlist。(具体细节可以在 source2e.pdf 中找到。)

因此实际上可以写得更加简单,不论 clr\endweizi 都可以定义为 \def\endweizi{\endminipage\endtrivlist}

包装成一个环境就是:

\newenvironment{weizi}[2][c]
  {\strcase{#1}
      {{c}{\center}
        {l}{\flushleft}
        {r}{\flushright}}
      {}
      {\center}
    \minipage{#2\textwidth}}
  {\endminipage\endtrivlist}

使用方式是完全相同的。

另一个就是使用 cmdxparse),我们可以方便的使用可选参数:

\DeclareDocumentEnvironment {weizi} { !D(){} !O{c} !D(){#1} }
  {\strcase{#2}
      {{c}{\center}
        {l}{\flushleft}
        {r}{\flushright}}
      {}
      {\center}
    \minipage{#3\textwidth}}
  {\endminipage\endtrivlist}

这样,

\begin{weizi}
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
\end{weizi}

\begin{weizi}(0.5)
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
\end{weizi}

\begin{weizi}[c]
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
\end{weizi}

\begin{weizi}[c](0.5)
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
\end{weizi}

\begin{weizi}(0.5)[c]
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
\end{weizi}

都是可以的。

汇总:

\documentclass{ctexart}

% \strcase := LaTeX3 \str_case_e:nnTF
\expandafter\let\expandafter\strcase\csname str_case_e:nnTF\endcsname

\begin{document}

\newenvironment{weizi}[2][c]
  {\strcase{#1}
      {{c}{\center}
        {l}{\flushleft}
        {r}{\flushright}}
      {}
      {\center}
    \minipage{#2\textwidth}}
  {\endminipage\endtrivlist}

\begin{weizi}[c]{0.5}
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
\end{weizi}

\renewcommand\weizi[2][c]{%
  \strcase{#1}
    {{c}{\def\endweizi{\end{minipage}\end{center}}%
         \begin{center}}
     {l}{\def\endweizi{\end{minipage}\end{flushleft}}%
         \begin{flushleft}}
     {r}{\def\endweizi{\end{minipage}\end{flushright}}%
         \begin{flushright}}}
     {}
     {\def\endweizi{\end{minipage}\end{center}}%
      \begin{center}}%
  \begin{minipage}{#2\textwidth}}

\begin{weizi}[c]{0.5}
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
\end{weizi}


\DeclareDocumentEnvironment {weizi} { !D(){} !O{c} !D(){#1} }
  {\strcase{#2}
      {{c}{\center}
        {l}{\flushleft}
        {r}{\flushright}}
      {}
      {\center}
    \minipage{#3\textwidth}}
  {\endminipage\endtrivlist}

\begin{weizi}
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
\end{weizi}

\begin{weizi}(0.5)
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
\end{weizi}

\begin{weizi}[c]
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
\end{weizi}

\begin{weizi}[c](0.5)
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
\end{weizi}

\begin{weizi}(0.5)[c]
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
  文字文字文字文字文字文字文字文字文字文字文字文字文字文字文字
\end{weizi}

\end{document}

传统方式:

\documentclass{article}
\usepackage{ctex}
\usepackage{makecell}
\usepackage{float}
\usepackage{multirow}
\usepackage{booktabs}

\usepackage[margin=2cm]{geometry}
\usepackage{caption}
\begin{document}
\begin{table}[H]
\renewcommand\arraystretch{1.35}
\linespread{1.2}\selectfont
\centering
\caption{子女学业负担变量测量}
\label{table:academic_burden}
\begin{tabular}{p{2cm}<{\centering}|m{2cm}<{\centering}|m{5.5cm}<{\centering}|c|c}
\specialrule{0.08em}{0pt}{0pt}
变量 & 维度 & 题项 & 变量类型 & 赋值 \\
\hline
\multirow[b]{7}{2cm}[-1.2cm]{\centering 子女\\学业负担} & \multirow[b]{3}*[-.2cm]{学习时间} & 孩子平均每天完成学校布置的作业的时间为? & 连续型变量 & \\

\cline{3-5}
~ & ~ & 孩子平均每周参加补课的时间为?&连续型变量 & \\

\cline{3-5}
~ & ~ & 孩子平均每周完成课外辅导班(家教、家长)布置的作业的时间为? & 连续型变量 & \\
\cline{3-5}
~ & ~ & 孩子上学期间平均每天的睡眠总时间(包含午睡)为?& 连续型变量 & \\

\cline{2-5}
~ & \multirow[b]{3}*[-1.3cm]{学业压力} & 孩子在学习时对自身感到满足和喜悦的程度?& 多分类变量
& \makecell{1--程度很高 \\ 2--程度较高 \\ 3--程度一般 \\ 4--程度较低 \\ 5--程度很低 }\\

\cline{3-5}
~ & ~ & 学生在学习中感到焦虑、厌倦的程度?&    多分类变量    &\makecell{1--程度很低 \\ 2--程度较低 \\ 3--程度一般 \\ 4--程度较高 \\ 5--程度很高} \\

\cline{3-5}
~ & ~ & 学生在学习时出现对学习的抵触行为?&    多分类变量    &\makecell{1--很少 \\ 2--较少 \\ 3--一般 \\ 4--较多 \\ 5--很多} \\
\specialrule{0.08em}{0pt}{0pt}
\end{tabular}
\end{table}
\end{document}

image.png

使用 \intertext 即可。

但是这样的“点画线”并不是等长的。还需要使用 \makebox 制作一个定宽的。

\newcommand*\fixeddot{\hfill\makebox[4cm]{\dotfill}}

\documentclass[UTF8,11pt]{ctexart}
\usepackage{amsmath}
\def\fixeddotpoint#1{\hfill\allowbreak\hspace*{\fill}\makebox[4cm]{\dotfill #1}}
\begin{document}
    \begin{align*}
    & \lim_{x\rightarrow 0} \frac{f\left( e^{x^2} \right) -3f\left( 1+\sin ^2x \right)}{x^2}=\lim_{x\rightarrow 0} \frac{f\left( e^{x^2} \right) -f\left( 1 \right) +3f\left( 1 \right) -3f\left( 1+\sin ^2x \right)}{x^2}
    \\
    &=\lim_{x\rightarrow 0} \frac{f\left( e^{x^2} \right) -f\left( 1 \right)}{e^{x^2}-1}\frac{e^{x^2}-1}{x^2}-3\lim_{x\rightarrow 0} \frac{f\left( 1+\sin ^2x \right) -f\left( 1 \right)}{\sin ^2x}\frac{\sin ^2x}{x^2}  
\intertext{\fixeddotpoint{6分}}
    &=\lim_{x\rightarrow 0} \frac{f\left( e^{x^2} \right) -f\left( 1 \right)}{e^{x^2}-1}\lim_{x\rightarrow 0} \frac{e^{x^2}-1}{x^2}-3\lim_{x\rightarrow 0} \frac{f\left( 1+\sin ^2x \right) -f\left( 1 \right)}{\sin ^2x}\lim_{x\rightarrow 0} \frac{\sin ^2x}{x^2}
    \\
    &=f'\left( 1 \right) -3f'\left( 1 \right) =-2f'\left( 1 \right) 
    \end{align*}
    
    这是一个666的操作\fixeddotpoint{6分}
\end{document}

image.png

\documentclass{article}
\usepackage{pgfplots}
\begin{document}

\begin{tikzpicture}
\begin{axis}[axis lines=middle,
  unit vector ratio=1 1,
  enlarge x limits=0.1,
  ymax=1.9,ymin=-1.6,
  xlabel={$x$},ylabel={$y$},
  xlabel style={below},ylabel style={left},
  very thick, tick style={very thick,black},
  ytick={1},xtick={-2,2},
]
\addplot+[samples=201,mark=none,domain=-2:2] {(2*x^2-exp(abs(x))};
\node[below left] at (axis cs:0,0) {$O$};
\end{axis}
\end{tikzpicture}

\end{document}

image.png

mtpro2 是商业字体,TeXLive 中不包含 mtpro2,overleaf 自然也不会有。你需要将所有字体、宏包上传至你的目录中。

NotoSansMathRM 没有相应的虚拟字体(vf)。notosansmia 是与 notosansmi 对应的 upright 字体。

\documentclass{beamer}
\usefonttheme{professionalfonts}
\usepackage[T1]{fontenc}

\DeclareSymbolFont{letters}{OML}{notosansmi}{m}{it}
\DeclareSymbolFont{operators}{OT1}{NotoSans-TLF}{m}{n}

\DeclareFontFamily{OML}{notosansmia}{}
\DeclareFontShape{OML}{notosansmia}{m}{n}{<-> notosansmia}{}
\DeclareSymbolFont{upgrl}{OML}{notosansmia}{m}{n}
\DeclareMathSymbol{\upxi}{\mathord}{upgrl}{24}
\DeclareMathSymbol{\uppi}{\mathord}{upgrl}{25}

\begin{document}
\frame{
    \large
\[ \frac{n!}{\Big(\dfrac{n}{\mathrm e}\Big)^n\sqrt{2\uppi n}}
\sim {\mathrm e}^{\frac{1}{12+\upxi}}
\]
vs
\[ \frac{n!}{\Big(\dfrac{n}{\mathrm e}\Big)^n\sqrt{2\pi n}}
\sim {\mathrm e}^{\frac{1}{12+\xi}}
\]
}
\end{document}

image.png

另外,数学中常数一般用直立体(upright),这里 \xi 应该不是常数,不必用直立体。

设 c_i 为第 i 列的宽度,n 为列数,则
width = sum(i*c_i) + 2n*\tabcolsep
如果还有表格竖线,未加载 array 宏包时,表格竖线的宽度不予考虑。
如果加载了 array 宏包,则还要加上 vln*\arrayrulewidth,其中 vln 为竖线个数。
如果使用了双竖线(||),则还要加上 dvln*\doublerulesep,其中 dvln 为双竖线的个数。

几乎所有表格宏包都加载了 array 宏包,除了 tabularraytblr 表格的宽度不在讨论的范围之内。

\documentclass{article}
\usepackage{booktabs}
\usepackage{siunitx}
\usepackage{caption}

\begin{document}
\begin{table}[!htb]\small   
    \setlength{\tabcolsep}{8mm}
    \centering
    \renewcommand\arraystretch{1} 
    \caption{table}
    \begin{tabular}{p{3cm}<{\centering} p{3cm}<{\centering} p{3cm}<{\centering}}
        \toprule[1.5pt]
        parameter & unit & number\\
        \midrule[0.5pt]
        diameter &\unit{\mm} & 100  \\
        diameter &\unit{\mm} & 100  \\
        diameter &\unit{\mm} & 100  \\
        diameter &\unit{\mm} & 100  \\
        diameter &\unit{\mm} & 100  \\
        \bottomrule[1.5pt]
    \end{tabular}
    \label{table}
\end{table}    

\setbox0=\hbox{%
    \setlength{\tabcolsep}{8mm}%
    \renewcommand\arraystretch{1}%
    \begin{tabular}{p{3cm}<{\centering} p{3cm}<{\centering} p{3cm}<{\centering}}
        \toprule[1.5pt]
        parameter & unit & number\\
        \midrule[0.5pt]
        diameter &\unit{\mm} & 100  \\
        diameter &\unit{\mm} & 100  \\
        diameter &\unit{\mm} & 100  \\
        diameter &\unit{\mm} & 100  \\
        diameter &\unit{\mm} & 100  \\
        \bottomrule[1.5pt]
    \end{tabular}}
    
\noindent{\centering\copy0\par \vrule width \wd0 height 5pt\par}

\the\wd0 ~=
\the\dimexpr3cm+3cm+3cm+8mm+8mm+8mm+8mm+8mm+8mm\relax

\end{document}

image.png

发布
问题