Sagittarius Rover
Sagittarius Rover
我要成为TikZ糕手/(ㄒoㄒ)/~~

注册于 2年前

回答
96
文章
0
关注者
2

前几日仿照你的做法封装的\ex命令,下面是一个可能的mwe和效果图.

\documentclass[b5paper, openany]{ctexbook}
\usepackage[left=12mm,right=12mm,top=20mm,bottom=30mm]{geometry}
\usepackage{xcolor}
\usepackage{lipsum,zhlipsum}
\usepackage[many]{tcolorbox}
\NewTotalTColorBox{\ex}{O{问题} o m}{
    enhanced,breakable,
    colframe = cyan!75!black, 
    fonttitle = \bfseries,
    skin=bicolor,
    colbacktitle=cyan!85!black,
    colbacklower=cyan!85!black,
    sharp corners=all,
    boxed title style = {sharp corners},
    attach boxed title to top left={xshift=0mm,yshift=0mm},
    title=#1,
    IfNoValueF={#2}{%
        space to upper,
        halign lower=flush right,
        bottom=1mm,
        height=2.8cm,
        collower=red,
    }
}{
    #3
    \IfNoValueF{#2}{%
        \tcblower
        #2
    }
}
\begin{document}
    \section{测试}
    \ex{
        \lipsum[1]
    }
    \ex[一个问题]{
        \zhlipsum[2]
    }
    \ex[另一个问题][来源:\LaTeX\ Studio(2024)]{
        \zhlipsum[8-10]
    }
\end{document}

image.png

感觉这个代码不是人写的...
\tl_gclear:N \l_tmp_combined_tl里面的变量根本没用上,应该是\g_combined_tl

问题的关键是变量\seq_new:N \g_infos_seq在两次赋值之间没有\seq_gclear,下面是修改过后调试版的mwe:

\documentclass{ctexart}
\usepackage{expl3} % 加载 expl3 宏包

\begin{document}
\ExplSyntaxOn

% 声明全局序列
\seq_new:N \g_infos_seq

% 声明两个令牌列表
\tl_new:N \g_info_tl
\tl_new:N \g_title_tl

% 定义一个新的令牌列表用于存储拼接结果
\tl_new:N \g_combined_tl

% 定义一个新命令,将两个令牌列表拼接并添加到序列中
% 这个\concat_and_add_to_seq:的逻辑应该是: 
% 清空\g_combines_tl,合并两个token_list,最后转换为seq
\cs_new:Nn \concat_and_add_to_seq:
{

    \tl_gclear:N \g_combined_tl
    g_combined_tl~First~:\tl_use:N \g_combined_tl \par

    % 将第一个令牌列表的内容赋值到新令牌列表
    \tl_gset:Nx \g_combined_tl { \g_info_tl }
    g_combined_tl~Second~:\tl_use:N \g_combined_tl \par

    % 将第二个令牌列表的内容追加到新令牌列表
    \tl_gput_right:Nn \g_combined_tl { \g_title_tl }
    g_combined_tl~Third~:\tl_use:N \g_combined_tl \par

    % 将拼接后的令牌列表推送到全局序列的右边
    \seq_gput_right:NV \g_infos_seq \g_combined_tl
    seq的输出结果: \seq_use:Nn \g_infos_seq {} \par
}

% 给两个令牌列表赋值
\tl_gset:Nn \g_info_tl {123}

\tl_gset:Nn \g_title_tl {456}
% 调用命令将拼接结果添加到序列中
\concat_and_add_to_seq:

\seq_use:Nn \g_infos_seq {\par}

\seq_gclear:N \g_infos_seq \par

% 给两个令牌列表赋值
\tl_gset:Nn \g_info_tl {abc}
\tl_gset:Nn \g_title_tl {def}
% 调用命令将拼接结果添加到序列中
\concat_and_add_to_seq:
% 显示序列的内容
\seq_use:Nn \g_infos_seq {\par}

\ExplSyntaxOff
\end{document}

image.png

有几个疑问:
1.为什么要手动实现而不考虑bibtex等专业的文献引用,使用文献管理软件导出.bib样式简单又高效.

2.你想要的答案是不是类似自定义一个环境,然后你可以用\Cite{xx1} \Cite{xx2}的形式在文末插入呢?是否要保留交叉引用?也许你应该将需求表述的更加清楚.

你还没学会 markdown 的代码块语法咩 md官方教程

下面是一个mwe和效果(注意标点符号不应该被放在$ $内部)

\documentclass[12pt]{ctexart}
\usepackage{amsmath}
\usepackage{xeCJKfntef}
\begin{document}
\uline{由于 $Y$ 中的加法是 $Y\times Y\rightarrow Y$ 的连续映射.因此,若 $x\ll y$ ,则存在 $x$ 的邻域 $U$ , $y$ 的邻域 $V$ 使得 $V-U\subseteq \operatorname{int}Y_+,$ 故$U<V$ .}
\end{document}

image.png

汇总一下群友的讨论,虽然比较高深我没弄特别懂....
image.png

在某一些简单的情况下,如果只要求在嵌套环境内使用\verb||的话,可以尝试使用fancyvrb中提供的\Verb命令.

如果只想要把抄录环境作为单独参数的话,可以考虑Eureka提出的使用expl3中的\str_set:Nn\str_replace_all:Nnn函数,如下图中的YourVerb命令的定义. 同时还可以考虑鱼香肉丝没有鱼先生使用的xparse宏包中提供的v型参数,会将传入参数视为一个verbatim环境,但不可以嵌套在其他命令中.
(特别感谢@u19850 指出错误,一开始弄混了expl3中的V/v以及xparse中的V,没有亲自尝试)

image.png

image.png

确实发现新大陆了,xparse还支持这个v代表抄录环境.

Eureka大神还指出可以使用xsimverb宏包的\xsim_file_write_start:nx {\c_true_bool}{<filename>}把环境内容输出到外部文件,然后用\inputverb之类的命令读进来,如下这样做的话可以实现环境的嵌套.

% \RequirePackage{xsimverb}
\xsim_file_write_start:nx {\c_true_bool}{<file name>}
<content>
\xsim_file_write_stop:

lshort实现的example样例环境定义如下,对于verbatim的封装使用到了\verbatim@processline,\verbatim@start等,我不懂(/(ㄒoㄒ)/~~)

\makeatletter
\newwrite\example@out
\newlength\savefboxrule
\newlength\savefboxsep
\edef\example@name{\jobname-example.aux}
\newenvironment{example}%
{\begingroup\@bsphack
  \immediate\openout\example@out=\example@name
  \let\do\@makeother\dospecials\catcode`\^^M\active
  \def\verbatim@processline{\immediate\write\example@out{\the\verbatim@line}}%
  \verbatim@start}%
{\immediate\closeout\example@out\@esphack\endgroup%
  \trivlist\item\relax
  \setlength{\savefboxrule}{\fboxrule}%
  \setlength{\savefboxsep}{\fboxsep}%
  \setlength{\fboxsep}{0.015\textwidth}%
  \setlength{\fboxrule}{0.4pt}%
  \fcolorbox[gray]{0}{0.95}{%
    \begin{minipage}[c]{0.45\textwidth}%
      \setlength{\fboxrule}{\savefboxrule}%
      \setlength{\fboxsep}{\savefboxsep}%
      \small\verbatiminput{\example@name}%
    \end{minipage}%
  }%
  \hfill%
  \fbox{%
    \begin{minipage}[c]{0.45\textwidth}%
      \setlength{\fboxrule}{\savefboxrule}%
      \setlength{\fboxsep}{\savefboxsep}%
      \setlength{\parskip}{1ex plus 0.4ex minus 0.2ex}%
      \normalsize\input{\example@name}%
    \end{minipage}%
  }%
  \endtrivlist
}
\makeatother

以上只是作为聊天记录的保存marked

如果要在tcb内部实现插入代码的话,tcb提供了listings的功能(如下图所示),但是考虑到封装性此处的命令\Exercise似乎并不太好简单地嵌入verbatim的效果.

image.png

和题主要求的不是特别相关,前几天正好学习了\tikzmath的有关功能,也实现了九九乘法表...
下面是一个MWE的片段

\usepackage{amsmath}
\usepackage{tikz}
\usepackage{xcolor}
\usepackage{pgffor}
\usetikzlibrary{math} % 感谢鱼香肉丝没有鱼先生
-------------------------------------------------------
\begin{tikzpicture}
    \tikzmath{
        function paint_rectangle(\x,\y){
            int \i,\j,\k;
            for \i in {1,...,\x}{
                for \j in {1,...,\y}{
                    \k = \i * \j;
                    if \i <= \j then{
                        {
                            \node [rectangle,fill=green!30,draw=green!60,rounded corners] at (2.5*\i,\j) {\i $\times$ \j $=$ \k};
                        };
                    }else{
                        {
                            \node [rectangle,fill=violet!40,draw=violet!80,rounded corners] at (2.5*\i,\j) {$\j \times \i=\k$};
                        };
                    };
                };
            };
        };
        \A = 6;
        \B = 15;
        paint_rectangle(\A,\B);
    }
\end{tikzpicture}

image.png

不明白你想要的生效是什么意思?

image.png

似乎加上label选项即可.
下面是MWE和一个结合@深圳-Skyrmion提供的使用默认参数O的alternative solution.

\documentclass{ctexart}
\usepackage{xparse}
\usepackage{enumitem}
% 定义新的环境 ceshi,带有可选参数 o 和必要的内容参数 +b
% \NewDocumentEnvironment{ceshi}{o +b}{
%     \IfNoValueTF{#1}{% 如果没有提供可选参数
%         \begin{enumerate}
%             #2
%         \end{enumerate}
%     }{% 如果提供了可选参数
%         \begin{enumerate}[label=#1{\arabic*}]
%             #2
%         \end{enumerate}
%     }
% }{}
\NewDocumentEnvironment{ceshi}{O{} +b}{
    \begin{enumerate}[label=#1{\arabic*}]
        #2
    \end{enumerate}
}{}

\begin{document}
% 没有可选参数的 ceshi 环境
\begin{ceshi}
    \item 这是一
    \item 这是二
    \item 这是三
\end{ceshi}

%使用可选参数 resume 的 ceshi 环境
\begin{ceshi}[ahahaha]
    \item 这是新一
    \item 这是新二
    \item 这是新三
\end{ceshi}

\end{document}

下次可以指明参考代码来自:参考链接

一个显而易见的问题是,这段代码出现了两次
虽然我水平不够不太能看得懂,但是我删去其中一段之后不会出现类似无限递归调用的情况了.

\newtoks\patchtoks    % helper token register
\def\longpatch#1%     % worker macro
  {\let\myoldmac#1%
   \long\def#1##1{\patchtoks={##1}\myoldmac{\the\patchtoks}}}
\longpatch{\phantom}

至于要不要保留空白,if True:

\NewDocumentEnvironment{solution}{ +b }{%
  \ifsolution
      \textbf{答案}\quad #1
  \else
      \phantom{\parbox{\textwidth}{#1}}
  \fi
  }{\par}

if False:

\NewDocumentEnvironment{solution}{ +b }{%
  \ifsolution
      \textbf{答案}\quad #1
  %注释掉这个else的两行就可以实现去除空白
  % \else
  %     \phantom{\parbox{\textwidth}{#1}}
  \fi
  }{\par}

下面是一个xelatex+texlive运行成功的mwe

\documentclass[12pt]{ctexart}
\usepackage{xparse,zhlipsum}

\newtoks\patchtoks    % helper token register
\def\longpatch#1%     % worker macro
  {\let\myoldmac#1%
   \long\def#1##1{\patchtoks={##1}\myoldmac{\the\patchtoks}}}
\longpatch{\phantom}

\NewDocumentEnvironment{solution}{ +b }{%
  \ifsolution
      \textbf{答案}\quad #1
  %注释掉这个else的两行就可以实现去除空白
  % \else
  %     \phantom{\parbox{\textwidth}{#1}}
  \fi
  }{\par}

\newif\ifsolution
\solutiontrue %添加此句将输出答案,否则输出答案所需的空白
\begin{document}

设$f(x)$在$[0, 2]$上连续, 在$(0, 2)$内可导, 且$3f(0)=f(1)+2f(2)$, 证明: 存在存在$\xi \in (0, 2)$, 成立$f'(\xi)=0$.

\begin{solution}
  这是问题的解答.

  \zhlipsum[1]
\end{solution}

\begin{enumerate}
  \item 第一题的题目

  \begin{solution}
   \zhlipsum[1]
  \end{solution}
  \item 第二题的题目
  
  \begin{solution}
    这是第二题的答案
    \zhlipsum[8]
  \end{solution}
\end{enumerate}

\end{document}

image.png

个人感觉是你对上面链接的使用没有理解的很好.

如有错漏(尤其是对于patch的那一段),请各位批评指正。

为什么不看文档,是不喜欢吗?

image.png

image.png

建议在命令行输入texdoc tikz找到有关的符号的详细说明

image.png

(point A) -| (point B)指的是从A出发先水平再垂直方向连接坐标点B
(point A) |- (point B)指的是从A出发先垂直再水平方向连接坐标点B

这里的point可以是坐标形式 (2,4) 也可以是坐标点的名称 (S) 因为你前面已经定义了 \coordinate (S) at (2,2);

首先看你的第一个MWE:预定义了坐标点S(2,2)

\draw[red] (0,0) -- (0,0)-| (S);
\draw[blue] (0,0) -- (0,0) |- (S);

指的是从(0,0)出发,画红色直线到点(0,0),然后从(0,0)出发,先水平再垂直到(S),在脑海中想象,从(0,0)到(2,2)理应先向右再向上.同理,第二行代码从(0,0)画蓝色直线到点(0,0),之后先向上再向右,实际上符号|-以及-|是很形象和直观的.

P.S. 因此上面的代码中(0,0) -- (0,0)并无实际意义,可删去--(0,0).

接下来看第二个MWE,其实是稍微有点tricky的,看下面的例子.
诚如lshort中所言,此时指的是垂足模式

(0,0 -| S) 指 横坐标S的横坐标_, 纵坐标为 _0 的点
(0,0 |- S) 指 纵坐标S的纵坐标_,横坐标为 _0 的点
于是不难想象你得到的两条线.

但是上述表述诚如你所言,左边是一个坐标,右边是一个点,并不是规范的path (PointA) <curve-to> (PointB)表述形式,不建议使用.

关于显示坐标的问题,我不觉得上述的\path想象坐标是很困难的事情,你可以通过\node at (<point>) {$text$}来标注位置,不一定一定需要获得其坐标.

另一方面也可以使用pgfplots宏包提供的\getlastxy{\x}{\y}来获得当前坐标点的命令并保存到\x\y中,再使用\node输出,但是这样很繁琐,不如直接使用\node输出.

没有完全弄懂你的上述配置,但是要想解决的话,也许可以配置一个xelatex*2recipe
放到"latex-workshop.latex.recipes"内部

    {
      "name": "xelatex*2",
      "tools": [
        "xelatex",
        "xelatex",
      ],
    },

我想要解决你的问题可能需要研究一下latex-workshop插件预览pdf文件的位置信息文档
有可能这与你采用如下配置移动pdf文件位置有关

"outputDir": "./out",   // 设置编译输出文件的目录为 ./out
      "viewer": {
        "external": {
          "command": "cp %DIR%/%DOCFILE%.pdf %DOCFILE%.pdf.backup && cp %DIR%/%DOCFILE%.pdf %DOCFILE%.pdf",  // 复制生成的 PDF 文件到源文件目录
          "forwardSearch": {
            "args": []   // 设置正向搜索的参数
          }
        }
      }

个人觉得如非特别有必要,不要修改过多默认配置

浅浅自问自答一下,感谢啸行大佬的热情帮助,要想实现这一效果的话,还可以直接借助ctex宏包提供的format选项实现这一效果.

image.png

\documentclass[12pt]{ctexart}
\usepackage[margin=1in]{geometry}
\usepackage{amsmath}
\usepackage{hyperref}
\usepackage{lipsum}
\ctexset{
    section/name = {\S},
    subsection/name = {\S},
}
\numberwithin{equation}{section}
\begin{document}
\section{equation sign}
\subsection{first subsection}
\begin{align}
  a^2 + b^2 = c^2 \\
  1 + 1 = 3
\end{align}
\subsection{second subsection}
This is a text paragraph.
\section{ref style}
\subsection{A subsection}
\begin{subequations}
  \begin{align}
  \sum_{n=1}^{\infty} \frac{1}{n^2} &= \frac{\pi^1}{1111} \\
  \sum_{n=1}^{\infty} \frac{1}{n^2} &= \frac{\pi^2}{2222} \\
  \sum_{n=1}^{\infty} \frac{1}{n^2} &= \frac{\pi^3}{3333} \\
  \sum_{n=1}^{\infty} \frac{1}{n^2} &= \frac{\pi^4}{4444}\label{eq:pythagoras}
  \end{align}
  \label{eq:mult-lines}
\end{subequations}
\subsection{Another subsection}
\begin{equation}
    a^2+b^2=c^2
\end{equation}
Hello world \ref{eq:pythagoras}, equation ref style: \eqref{eq:pythagoras}
\end{document}

根据lshort中的介绍,也可以使用footnotemark配合footnotetext实现.

image.png

image.png

下面是mwe

\documentclass{book}
\usepackage[paperheight=3in]{geometry}
\usepackage{ctex}
\usepackage{tcolorbox}
\begin{document}

浔阳江头夜送客,枫叶荻花秋瑟瑟\footnote{注一}。

主人下马客在船,举酒欲饮无管弦。

\begin{tcolorbox}
    忽闻水上琵琶声,主人忘归客不发\footnotemark。

    醉不成欢惨将别\footnotemark,别时茫茫江浸月。
\end{tcolorbox}
\footnotetext[2]{注二}
\footnotetext[3]{注三}

\end{document}

当然,考虑到footnotetcolorbox环境更好的耦合性的话,还是建议使用@u19850 🐟老师的做法。

PPPPPS.注意贴代码的时候可以善用markdown的代码块环境,同时善用预览功能,将你的所有代码都放到代码块内.

image.png

可以考虑before upper选项
下面是一个例子

\documentclass{book}
\usepackage{ctex}
\usepackage{tcolorbox}
\begin{document}
\tcbset{before upper={\parindent22pt}}
\begin{tcolorbox}
    第一段,先帝创业未半而中道崩殂,
    今天下三分,益州疲弊,此诚危急存亡之秋也。
    然侍卫之臣不懈于内,忠志之士忘身于外者,
    盖追先帝之殊遇,欲报之于陛下也。
    
    第二段,诚宜开张圣听,以光先帝遗德,
    恢弘志士之气,不宜妄自菲薄,
    引喻失义,以塞忠谏之路也。
    
    第三段,宫中府中,俱为一体,陟罚臧否,不宜异同。
    若有作奸犯科及为忠善者,宜付有司论其刑赏,
    以昭陛下平明之理,不宜偏私,使内外异法也。
\end{tcolorbox}
\end{document}

image.png

发布
问题