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

注册于 4年前

回答
219
文章
2
关注者
23

image.png

使用 etoc 宏包,虚线见 https://ask.latexstudio.net/ask/question/7397.html

\documentclass{ctexrep}
\usepackage{enumitem}
\usepackage{etoc}
%\usepackage[colorlinks]{hyperref}
\setmainfont{TeX Gyre TermesX}

\usepackage{dashrule}
\begin{document}

\ExplSyntaxOn
% https://ask.latexstudio.net/ask/question/7397.html
\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

\ctexset{section/tocline={\protect\numberline{第\chinese{section}节}#2}}

\makeatletter
\newlist{thetoclist}{itemize}{5}
% chapter
\setlist[thetoclist,1]{nosep,label=\etocnumber,
  left=0cm..5\ccwd,labelsep=1\ccwd}
% section
\setlist[thetoclist,2]{nosep,label=\etocnumber,
  left=5\ccwd..4\ccwd,labelsep=1\ccwd}
\newcommand{\thetoc@dashed}{\noindent
  \approxhdashrule[.6ex]{\linewidth}{.6pt}{4pt}\par}
\let\thetocdashed\relax
\providecommand{\three@digits}[1]{\ifnum#1<10 0\fi
  \ifnum#1<100 0\fi \number#1 }
\etocsetstyle{chapter}
  {\begin{thetoclist}}
  {\etociffirst{}{\thetoc@dashed}%
    \rmfamily\bfseries\item}
  {\etocname\hfill \slshape\three@digits\etocthepage}
  {\end{thetoclist}}
\etocsetstyle{section}
  {\begin{thetoclist}}
  {\normalfont\item}
  {\etocname\hfill \slshape\three@digits\etocthepage}
  {\end{thetoclist}}
\localtableofcontents
\makeatother

\cleardoublepage
\pagenumbering{arabic}
\chapter{双相障碍及精准医学}
\section{双相障碍概念}
\section{精准医学概念}

\chapter{双相障碍的临床表现}
\section{临床表现及分型}
\section{抑郁发作}

\setcounter{chapter}{10}

\chapter{双相障碍的病因机制假说}
\section{遗传与环境交互作用假说}

\end{document}

\documentclass{article}
\usepackage{enumitem}

\makeatletter
\newcommand\twodigitsarabic[1]{\two@digits{\value{#1}}}
\AddEnumerateCounter{\twodigitsarabic}{\@arabic}{99}
\makeatother

\begin{document}
\begin{enumerate}[label={\twodigitsarabic*.}]
\item content
\item content
\item content
\end{enumerate}
\end{document}

image.png

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

\begin{alignat*}{3}
&& \| S+T \|^{2}_{A}& = \omega ^{2}_{A}(S+T)                                        && \\
&&                  & \leq \sup_{\|x\|_{A}=1}(|\langle (S+iT)x,x \rangle _{A} |^{2} && \\
&&                  &                                     & \text{\llap{(by Lemma)}} & \\
&&                  & \leq \sup_{\|x\|_{A}=1}(|\langle (S+iT)x,x \rangle _{A} |^{2} && \\
\end{alignat*}

\end{document}

image.png

我没有下载 texstudio,
你可以换成 \lstinline|...| 试试,
不行再改成

\newcommand\myinline{\lstinline}

\myinline{...}

试试。

目前,TeX 的代码高亮不可能做到像其它编程语言的一样好。

ctex 在 pdftex 下使用 CJK 宏包,应该是和 newunicodechar 不兼容的。

\documentclass{book}
\usepackage[utf8]{inputenc}
\usepackage{newunicodechar}
\DeclareUnicodeCharacter{1F994}{\LaTeX}

\begin{document}

what?
????%% <-- U+1F994

\end{document}

image.png

这个可以在 pdftex 下编译,但改成 ctex 文档类就不行了。

可以上 https://github.com/CTeX-org/forum 问问。

第一个,由于 geometry 可能会改变正文宽度,页眉页脚宽度也会随之改变,\pagestyle 必须在 geometry 之后使用,或者在 geometry 之后加上 \fancyhfoffset{0pt},这样才能更新页眉页脚的宽度。

第二个,log 文件中已经写了:

Package fancyhdr Warning: \fancyhead's `E' option without twoside option is use
less on input line 9.

fancyhdr 的奇偶设置必须使用 twoside 文档类选项:\documentclass[twoside]{article}

实际上,PunctuationSpace 设置的是 \fontdimen7 的值。只有两个词中间的 \spacefactor 大于等于 2000 时,才会使用到这个值(即增加设置的这个间距)。

但是,一般情况下,;, 的 space factor 都是小于 2000 的,所以它们并不会像其它标点一样增加间距。

只要设置它们的 space factor 大于等于 2000 即可。比如:

\sfcode`\;2500 \sfcode`\,2250 

如果整篇文章的标点都要增加额外的间距的话,最好是重定义 \nonfrechspacing

\DeclareRobustCommand\nonfrenchspacing{\sfcode`\.3000 \sfcode`\?3000
  \sfcode`\!3000 \sfcode`\:2750 \sfcode`\;2500 \sfcode`\,2250 }

image.png

\documentclass{article}
\usepackage{fontspec}

\DeclareRobustCommand\nonfrenchspacing{\sfcode`\.3000 \sfcode`\?3000
  \sfcode`\!3000 \sfcode`\:2750 \sfcode`\;2500 \sfcode`\,2250 }
\nonfrenchspacing

\begin{document}

I can eat glass, it doesn't hurt me. I can eat glass, it doesn't hurt me.

\fontspec[PunctuationSpace=2]{Latin Modern Roman}
I can eat glass, it doesn't hurt me. I can eat glass, it doesn't hurt me.

\fontspec[PunctuationSpace=10]{Latin Modern Roman}
I can eat glass, it doesn't hurt me. I can eat glass, it doesn't hurt me.

\end{document}

要注意的是,如果标点符号前是大写字母,且并非缩写(比如 B.C. 这种),则需正确设置标点符号前的 space factor:

It is NASA. It is NASA\@. 
It is nasa. It is nasa.

image.png

\documentclass{article}
\usepackage{amsmath}
\usepackage{stackengine}
\usepackage{scalerel}

\newcommand\mysqrt[2][0pt]{\stretchrel{\sqrt{}}{\addstackgap%
  [#1]{$\displaystyle\overline{#2}$}}}

\begin{document}

\[ \mysqrt[1.1pt]{ \begin{vmatrix} a&b&c\\ d&e&f\\ g&h&i \end{vmatrix} } \]

\end{document}

image.png

见:https://tex.stackexchange.com/a/128119/232375

这种情况也可以考虑用指数表示。

小写的 o 才可以用 \IfNoValueTF 判断:

\NewDocumentEnvironment{example}{oo}
  {%
    \IfNoValueTF{#1}{...}{...}%
    \IfNoValueTF{#2}{...}{...}%
  }
  {}

大写的 O D 等参数,如果不给出,则使用默认值。
小写的 o d 等参数,如果不给出,则返回特殊的 -NoValue-,可以用 \IfNoValueTF 判断。

这是因为你使用了 Consolas 字体,而这个字体中没有这个 "␣"(U+2423,\textvisiblespace) 字符。可以在 log 文件中看到这一点。

如果必须使用 Consolas 字体,只要设置 showstringspaces=false 就可以了。

可以直接用 \lstset{showstringspaces=false},也可以

\begin{lstlisting}[language=R,showstringspaces=false]
    > grep("Pole",c("Equator","North Pole","South Pole"))
    [1] 2 3
    > grep("pole",c("Equator","North Pole","South Pole"))
    integer(0)
    # 看看区别
    > grepl("Pole",c("Equator","North Pole","South Pole"))
    [1] FALSE  TRUE  TRUE
    > grepl("pole",c("Equator","North Pole","South Pole"))
    [1] FALSE FALSE FALSE
\end{lstlisting}

image.png

第一个,用 boxed title style,见文档 177 页:

\documentclass{ctexart}
\usepackage[most]{tcolorbox}
\usepackage{tikz}
\usetikzlibrary{calc}
\newtcolorbox{mybox}{
    enhanced,
    attach boxed title to top center={ yshift = -\tcboxedtitleheight/2, yshifttext=-2mm},
    colbacktitle = white,coltitle=black,title = 练习,
    boxrule = 2pt,
    boxed title style={
        frame code={
            % 以下代码可实现取中点1
            \fill[color = green] (frame.north west)--(frame.north east)
              --([xshift = 0.3cm,yshift =-1pt]$(frame.north east)!0.5!(frame.south east)$)
              --(frame.south east)--(frame.south west)
              --([xshift = -0.3cm,yshift = -1pt]$(frame.south west)!0.5!(frame.north west)$)
              --cycle;
        }
    }
}

\begin{document}
    \begin{mybox}
        1.分别写出“两个三角形全等”和“两个三角形相似”的几个充要条件。\par 
    \end{mybox}
\end{document}

image.png

第二个,使用 title code 时,标题还未构建,title node 不可用。

在每个章节的开始处将计数器的值写入 aux 文件中,

\usepackage{atveryend}
\makeatletter
\newcounter{problem} % 问题总个数
\protected\def\write@problem@counter #1{% 计数器写入辅助文件, #1 为第几个
  \immediate\write\@auxout{\string\global\string\@namedef
    {label/problem/atchap\number #1}{\number\value{problem}}}}
\AtBeginDocument{%
  \providecommand\totalproblemcount{0}% 总个数:\totalproblemcount
  \write@problem@counter{0}} % 第 0 个
\AfterLastShipout{\immediate\write\@auxout{%
    \string\gdef\totalproblemcount{\value{problem}}}% 总个数:\totalproblemcount
  \stepcounter{problem}%
  \write@problem@counter{\numexpr\value{chapter}+1}} % 第 n+1 个
% 得到保存的第 #1 个 problem 的值
\def\getproblemcount #1{\ifcsname label/problem/atchap\number\numexpr #1\relax\endcsname
  \expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
  {\@nameuse{label/problem/atchap\number\numexpr #1\relax}}{-1}}
% #1+1 个与 #1 个的差 
\def\problemcounterdiff #1{%
  \ifnum\getproblemcount{#1+1}>\z@
    \the\numexpr\getproblemcount{#1+1}-\getproblemcount{#1}\relax
  \else 0???\fi}
\makeatother

然后在 \chapter 开始(或结尾)时,将第 \value{chapter} 个写入 aux 文件:

\renewcommand\chapter{
  ...
  \refstepcounter{chapter}
  ...
  \write@problem@counter{\value{chapter}}
  ...
}

还需在每个问题开始时都递增 problem 计数器。

如果你使用了 unicode-math 宏包,则必须将这重定义的代码放在 \AtBeginDocument 中,或者直接在正文而非导言区修改它。如\AtBeginDocument{\recommand\Re ...},因为 unicode-math 使用这种方式重新定义了 \Re

这个问题涉及到 TeX 的内部处理,最好读过 TeX by topic 的第 1、2 章

首先说说 TeX 是怎样处理一个输入行的。
TeX 从文件中读入一行,去掉行终止符(catcode=5),去掉行尾空格,插入 \endlinechar,一般为 return 字符(ASCII 13)。
然后逐个读取字符,当遇到控制词(转义符+一串catcode=11的字符)或控制空格(转义符+空格字符ASCII 32)时进入状态 S,此状态后续的空格符(catcode=10)被忽略,如果在这个状态遇到行终止符,则连同这个行终止符及本行未读入的字符都被忽略了。

问题出现在 \newenvironment 这一行。
当读到控制序列 \let 后,进入状态 S,随即遇到行终止符 ^^M(ASCII 13),它连同这行未处理的字符都被忽略了。所以正常情况下,一直到文件的结束 TeX 都没有遇到与 { 匹配的那个 }

但为什么你的没有报错呢?是因为你之前把 ^^M 的 catcode 设置为 10 了,这是空格的 catcode,而不是行结束符(catcode=5)的。如果你把之前的 ^^M 的 catcode 设为 5,就会得到 low-level 的错误。

为了正确定义这个环境,需首先修改 ^^M 的 catcode,然后定义完再恢复:

\catcode`\^^M=13 % 这里最好使用注释符
\newenvironment{makeEnterMacro}{\catcode`\^^M\active \let^^M\LaTeX\relax}{\catcode`\^^M=5 }% 同上
\catcode`\^^M=5 % 同上

MWE:

\documentclass[UTF8]{ctexart}\pagestyle{empty}
\begin{document}

\catcode`\^^M=13 %
\newenvironment{makeEnterMacro}{\catcode`\^^M\active \let^^M\LaTeX\relax}{\catcode`\^^M=5 }%
\catcode`\^^M=5 %

\begin{makeEnterMacro}
此环境
怎么就出错了呢
\end{makeEnterMacro}

\end{document}

得到了想要的结果:
image.png

另外,如果你更新到了最新的 LaTeX 发行版(2022-06-01),则可以直接修改 \obeyedline,然后使用 \obeylines

\makeatletter
\newenvironment{mychoices}
  {\def\obeyedline{\@ifnextchar\end{\par}{\item}}\obeylines
    \begin{itemize}}
  {\end{itemize}}
\makeatother

\begin{mychoices}
选
项
\end{mychoices}

\int_step_inline:nn 不能被完全展开,而且 expand 选项只会展开一次,只能使用类似 \int_step_inline:nn {} { \tl_put_right:Nn ... } 的方式将内容存入宏中,然后再在 tblr 中展开这个宏。

\documentclass{ctexart}
\usepackage{tabularray}

\ExplSyntaxOn
% \tl_new:N \l__my_choice_colspec_tl % colspec 选项可要可不要
\tl_new:N \l__my_choice_content_tl
\NewDocumentCommand \choiceTable { +O{} O{1} m m } % tblr options, first num, last num, ...
  {
    % \tl_set:Nx \l__my_choice_colspec_tl { \prg_replicate:nn { #3-#2+2 } { l } } % colspec 选项
    \tl_clear:N \l__my_choice_content_tl
    \tl_put_right:Nn \l__my_choice_content_tl { 题号 }
    \int_step_inline:nnnn {#2} { 1 } {#3}
      { \tl_put_right:Nn \l__my_choice_content_tl { & ##1 } }
    \tl_put_right:Nn \l__my_choice_content_tl { \\ 答案 }
    \tl_put_right:Nx \l__my_choice_content_tl
      { \prg_replicate:nn { #3 - #2 } { & } } % 第二行的 & & & ...
    % \tl_put_right:Nn \l__my_choice_content_tl { \\ } % 最后一个 \\ 可要可不要
    \begin{tblr} [ expand = \l__my_choice_content_tl ] {#1}
      \l__my_choice_content_tl 
    \end{tblr}
  }
\ExplSyntaxOff


\begin{document}

\choiceTable[hlines,vlines]{5}{}

\choiceTable[hlines,vlines][6]{10}{}

\end{document}

image.png

当然,这个实现并不能自动换行,但是也不难实现,只要在适当位置插入 \\ 等内容即可。

发布
问题