芒果不盲
芒果不盲
学好TiKZ和tcolorbox!

注册于 3年前

回答
51
文章
1
关注者
2

使用 titlesec 和 tikz 包试了一下

\documentclass{ctexbook}
\setCJKfamilyfont{kaiti}{KaiTi}[AutoFakeBold]
\usepackage[margin=2cm]{geometry}
\usepackage{tikz}
\usetikzlibrary{shapes.symbols}
\usepackage[explicit]{titlesec}
\titleformat{\chapter}
{}
{}
{0em}
{
  \begin{tikzpicture}[remember picture,overlay]
    \draw[cyan!50,step = 0.02\paperwidth] (current page.north west) grid ++ (\paperwidth,-5.12);
    \node[font = \LARGE\bfseries\CJKfamily{kaiti},text = brown,] at ([yshift = -2.56cm]current page.north) {\tikz[baseline]{\node[anchor = base,cloud, cloud puffs=11, cloud ignores aspect, fill=cyan!50,]{第~\thechapter{}~章};} #1};
  \end{tikzpicture}
}
\begin{document}
\chapter{葵花宝典}
欲练此功,必先自宫!
\chapter{九阴真经}
欲练此功,也要自宫!
\end{document}

效果如下:
1.png

2.png

  • 标题问题,请读 caption
  • 对齐问题,阅读 lshort-zh-cn 第 3.6.1 小节
  • 认真读
\documentclass{article}
\usepackage{booktabs}%提供命令toprule、midrule、bottomrule
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{amssymb}
\usepackage{array}
\usepackage{bm}
\usepackage{booktabs}%提供命令toprule、midrule、bottomrule
\usepackage{float}%提供float浮动环境
\begin{document}
\begin{table}[H]

\caption{Predicted and measured values of the quadratic slope parameters in the$K\longrightarrow 3\pi$ amplitudes (Kambor  $et$ $al$ 1992). All values are given in units of $10^{-8}$}.%标题
\centering%把表居中
\setlength{\tabcolsep}{.3cm}

\begin{tabular}{cr@{$\pm$}lr@{$\pm$}l}%四个c代表该表一共四列,内容全部居中
    \toprule%第一道横线
    Parameter&\multicolumn{2}{c}{Experimental value}&\multicolumn{2}{c}{Prediction}\\
    \midrule%第二道横线 
    $\zeta_{1}$&$-0.47$ &  $0.15$ & $-0.47$ & $0.18$\\
    $\xi_{1}$&$-1.51$ & $ 0.30$&$-1.58 $ & $0.19$\\
    $\zeta_{3}$&$-0.21$ & $ 0.08$&$-0.011$ & $ 0.006$\\
    $\xi_{3}$&$-0.12$ & $ 0.17$&  $0.092 $ & $ 0.030$\\
    $\xi^{\prime}_{3}$&$-0.21$ & $ 0.51$&$-0.033$ & $ 0.077$\\
    \bottomrule%第三道横线
\end{tabular}
\end{table}
\end{document}

QQ截图20220818202905.png

仔细整理一下你的代码,其实你在嵌套循环

\begin{tikzpicture}
 \foreach \x in{0,2} %2
 {
   \foreach \y in{0,-1} %2
   {
     \foreach \z in{A,B,C,D} %4
     {
      \foreach \m/\n/\l in{\x/\y/\z}
      {
        \node[draw] at(\m,\n){\l}; % 2 x 2 x 4 = 16
      }
     }
   }
 }
\end{tikzpicture}

循环次数分别是 2,2,4,1. 所以一共是 2x2x4x1=16 次,你的这种想法我大概明白了,但是目前我并没有好的办法.
或许可以使用计数器来代替第三层循环,如下

\begin{tikzpicture}
\newcounter{node}
\setcounter{node}{1}  
 \foreach \x in{0,2} %2
 {
   \foreach \y in{0,-1} %2
   {
      \node[draw] at (\x,\y){\Alph{node}\stepcounter{node}};
   }
 }
\end{tikzpicture}

给另外一个例子,或许可以给你提供一点思路,如下:
我想构造两个循环,但是他们不嵌套,而是一一对应,第一层为
1,2,3,4,...,10, 第二层为2,4,6,8,...,20,当然你可以使用:

\foreach \x/\y in {1/2,2/4,3/6,4/8,5/10,6/12,7/14,8/16,9/18,10/20}
{
  ...
}

这样固然是可行的, 但是难免有些繁琐, 毕竟两个循环的值是有函数关系的,那么可以:
方法一

\foreach \x in {1,2,...,10}
{
  \pgfmathsetmacro{\y}{2*\x} % \y = 2*\x 
  \node[] at (\x,0) {\y};
}

方法二

\foreach \x [count=\xc] in {1,2,...,10}
{
  \foreach \y [count=\yc] in {2,4,...,20}
  {
    \ifnum\xc=\yc
    \node[] at (\x,0) {\y};
    \fi 
  }
}

希望能够帮助到你!


关于二维数组,可以使用 LaTeX3 实现一个阉割版的 二维数组

\documentclass{article}
\usepackage{tikz}

\begin{document}
\ExplSyntaxOn
\seq_new:N \l_node_row_seq  
\seq_new:N \l_node_tmp_seq 
\cs_set:Npn \GetArray #1 {
  \seq_set_split:Nnn \l_node_row_seq {;} {#1}
  \int_step_inline:nn{\seq_count:N \l_node_row_seq}
  {
    \seq_if_exist:cF {l_node_row_##1_seq}
    {
      \seq_new:c {l_node_row_##1_seq}
    }
    \exp_args:Ncx\seq_set_from_clist:Nn {l_node_row_##1_seq} {\seq_item:Nn \l_node_row_seq{##1}}
  }
}

\cs_set:Npn \PrintArray [#1][#2] {
  \tl_if_empty:nTF { #1 }
  {
    \tl_if_empty:nTF { #2 }
    {
      \seq_use:Nn \l_node_row_seq {,}
    }
    {
      \int_step_inline:nn{\seq_count:N \l_node_row_seq}
      {
        \seq_put_right:Nn \l_node_tmp_seq {\seq_item:cn {l_node_row_##1_seq}{#2}}
      }
      \seq_use:Nn \l_node_tmp_seq {,}
    }
  }
  {
    \tl_if_empty:nTF {#2}
    {
      \seq_use:cn {l_node_row_#1_seq}{,}
    }
    {
      \seq_item:cn {l_node_row_#1_seq}{#2}
    }
  }
}
\ExplSyntaxOff


\GetArray
{
  A,B,C;
  D,E,F;
  G,H,I
}
\PrintArray[][]\par 
\PrintArray[1][]\par 
\PrintArray[][2]\par 
\PrintArray[1][2]

\vspace*{1cm}

\begin{tikzpicture}
\GetArray
{
  A,B,C;
  D,E,F;
  G,H,I
}
\foreach \x in {1,2,3}
{
  \foreach \y in {1,2,3}
  {
    \node[draw] at (\x,\y) {\PrintArray[\x][\y]};
  }
}
\end{tikzpicture}

\end{document}

QQ截图20220802234351.png

测试没有问, 请提供 mwe

\documentclass{article}
\usepackage{codehigh}
\usepackage[margin=1cm]{geometry}
\begin{document}
\makeatletter
\begin{demohigh}
 %\makeatletter
\def\@cmd[#1]#2{\textcolor{red}{#1} and (#2)}
\def\cmd{
  \@ifnextchar[{\@cmd}{\@cmd[default]}
}
\cmd{aaa}\par 
\cmd[bbb]{aaa}\par 

\def\@cmd[#1]#2{\c@md{} and \textcolor{red}{#1} and (#2)}
\def\cmd#1{
  \def\c@md{#1}\@ifnextchar[{\@cmd}{\@cmd[default]}
}
\cmd{aaa}{ccc}\par 
\cmd{aaa}[bbb]{ccc}    
 %\makeatother  

\end{demohigh}
\makeatother
\end{document}

编译环境
win11 + texlive2022 + xelatex && pdflatex
ASD.png

  • \def\@dnode[#1]#2#3#4{\node(#2)at(#3){#4};} 的问题,#1 没有传进去,改为

\def\@dnode[#1]#2#3#4{\node[#1](#2)at(#3){#4};}

  • LaTeX2e 提供了 \newcommand 命令可以定义一个带可选参数的命令,此外可以看看 xparse 宏包,其基于 LaTeX3 更加灵活
\makeatletter
\def\@dnode[#1]#2#3#4{\node[#1](#2)at(#3){#4};}
\def\dnode{\@ifnextchar[{\@dnode}{\@dnode[inner sep=2pt,fill=yellow]}}
\makeatother

\begin{tikzpicture}
  \dnode{a}{1,2}{\LaTeX}
  \dnode[draw,fill=red]{b}{3,2}{hello!}
\end{tikzpicture}

典型宏展开问题
报错信息如下

Package pgfkeys: I do not know the key '/tikz/\inns {2}' and I am going to ignore it. Perhaps you misspelled it.

也就是说 tikz\inns{2}(还没展开成 inner sep=2pt) 当作了键值, 但是它无法识别,为此我们必须改变 \node\inns 两个命令的展开顺序,做如下修改

  • 不使用 \NewDocumentCommand 来定义要展开的命令,使用 \def 或者 \newcommand
\newcommand{\inns}[1]{inner sep=#1pt} 
  • 改变宏展开顺序
\expandafter\node\expandafter[\inns{2}](b)at(1,0){B};

mwe

\documentclass{article}
\usepackage{tikz}
\begin{document}
\NewDocumentCommand\tik{m}{
\begin{tikzpicture}
#1
\end{tikzpicture}
}
\newcommand{\inns}[1]{inner sep=#1pt}

\tik{
\node(a)at(0,0){A};
\expandafter\node\expandafter[\inns{2}](b)at(1,0){B};
\draw(a)--(b);
}
\end{document}

另外 \NewDocumentCommand 命令定义的命令是受保护的,但是 xparse 包也提供了 \NewExpandableDocumentCommand,但经过测试失败,不知为何

简单回答一下

  • pgf/TiKZ 中有两个尺寸寄存器 \pgf@x \pgf@y 分别用于保存当前的坐标,(类似你的 \pgfgetlastxy)但是“很遗憾”,他们的单位都是 pt,如:
\makeatletter
\begin{tikzpicture}
\path (1,1);
\node[above right] at (1,1) {(\the\pgf@x,\the\pgf@y)};
\end{tikzpicture}
\makeatother

得到
QQ截图20220728222852.png

为此你需要将其转化为 cm, 可以定义一个命令

\def\pttocm#1{\pgfmathparse{#1/28.45274}\pgfmathresult}

pt 转化为 cm
一个完整的 mwe:

\documentclass{article}
\usepackage{tikz} 

\begin{document}
\def\pttocm#1{\pgfmathparse{#1/28.45274}\pgfmathresult}
\makeatletter
\begin{tikzpicture}
\path (1,1);
\node[above right] at (1,1) {(\pttocm{\the\pgf@x},\pttocm{\the\pgf@y})};
\end{tikzpicture}
\makeatother
\end{document}

QQ截图20220728223513.png

  • 此外,你的提问习惯不太好,希望你提问能够好好理解 mwe 一词,不然一大堆代码,没那么多人愿意帮你分析(个人观点)

tikz 画了一下,可以自己搬到 tcolorbox 里面

\documentclass[margin=.5cm]{standalone}
\usepackage{tikz,ctex}
\usepackage{fontawesome5}
\usetikzlibrary{arrows.meta,calc}

\begin{document}

\begin{tikzpicture}[thick]
\draw[] (0.4,0) arc(0:90:0.4) -- (0,1.6) arc(-90:0:0.4) --(5.6,2) arc(180:270:0.4) --(6,0.4) arc(90:180:0.4) --cycle;


\foreach \x in {(45:0.382),($(0,2)+(-45:0.382)$),($(6,2)+(225:0.382)$),($(6,0)+(135:0.382)$)}
{
  \node[inner sep=0pt,] at \x 
  {
   \begin{tikzpicture}
    \draw[fill=white,thick,rotate=45,line join=round,x=0.12cm,y=0.12cm] (1,0) to [out=180,in=-90] (0,1) to [out=-90,in=0] (-1,0) to[out=0,in=90] (0,-1) to[out=90,in=180] (1,0)--cycle;
   \end{tikzpicture}
  };
}

\draw[] (0.3,0.075) -| (0.075,0.3);
\draw[] (0.075,1.7) |- (0.3,2-0.075);
\draw[] (5.7,2-0.075) -| (6-0.075,1.7);
\draw[] (6-0.075,0.3) |- (5.7,0.075);

\draw[] (0.075,0.5) -- (0.075,1.5);
\draw[] (0.5,2-0.075) -- (5.5,2-0.075);
\draw[] (6-0.075,1.5) -- (6-0.075,0.5);
\draw[] (5.5,0.075) -- (0.5,0.075);


\node[font=\kaishu\bfseries] at (3,1.1) {奈何蝶飞去};
\node[font=\kaishu\bfseries,scale=0.6] at (3,1.5) {引蝶之章 第一幕};
\draw[line cap=round] (2,0.8) -- (4,0.8)node[midway,fill=white,inner sep=2pt,scale=0.6]{\faGg};

\node[font=\kaishu\bfseries,scale=0.6] at (3,0.45){已开启};
\end{tikzpicture}

\end{document}

QQ截图20220727100628.png

另外,楼上@u40 啸行的答案很有参考性!!!

\begin{tikzpicture}
  \node[] (a) {$x$};
  \draw[->] (a.north) to[out=135,in=90] ([xshift=-0.2cm]a.west) to[out=-90,in=-135] (a.south);
\end{tikzpicture}

QQ截图20220726193530.png

\begin{tikzpicture}
  \node[inner sep=1pt] (a) at (0,0) {$x$};
  \node[inner sep=1pt] (b) at (2,2) {$y$};
  \draw[-latex] (a.0) -- (b.-90);
  \draw[-latex] (a.90) to[out = 90,in=180]  (b.180);
\end{tikzpicture}

QQ截图20220726215319.png

提供一种思路

使用 magicwatermark 宏包, 并通过外部文件来添加页脚信息.

%pagefoot.txt
{faraday.jpg}{爱情既是友谊的代名词,又是我们为共同的事业而奋斗的可靠保证,爱情是人生的良伴,你和心爱的女子同床共眠是因为共同的理想把两颗心紧紧系在一起。\par \hfill ------ 法拉第}
{newton.jpg}{苹果砸了我的头,我成了物理学家。\par \hfill ------ 牛顿}
%main.tex
\documentclass{ctexart}
\usepackage[margin=2cm]{geometry}
\usepackage{graphicx}
\graphicspath{{figure/}}
\usepackage{fontawesome5}
\usepackage{magicwatermark}
\usepackage{zhlipsum}

\ExplSyntaxOn
\clist_clear_new:N \l_pagefoot_image_clist 
\clist_clear_new:N \l_pagefoot_text_clist

\cs_new:Npn \pagefoot_add_content:nn #1#2 {
  \clist_gput_right:Nn \l_pagefoot_image_clist { #1 }
  \clist_gput_right:Nn \l_pagefoot_text_clist { #2 }
}
\ior_open:Nn \g_tmpa_ior { pagefoot.txt }
\ior_map_inline:Nn \g_tmpa_ior 
{
  \pagefoot_add_content:nn #1
}
\ior_close:N \g_tmpa_ior

\PageSetup*{
  \begin{tikzpicture}[remember~picture,overlay]
    \fill[red!25] ([xshift=1cm]current~page.south~west) rectangle ([yshift=3cm]current~page.south~east);
    \fill[red!50] ([xshift=1cm,yshift=1cm]current~page.south~west) --++(0,2) -- ++(2,0)--cycle;
    \fill[red!50] ([xshift=-2cm]current~page.south~east) -- ++(2,0) -- ++(0,2)--cycle;
    \node[anchor=west] at ([shift={(1.2,1.5)}]current~page.south~west){\includegraphics[width=1.8cm,height=2.4cm]{\clist_item:Nn \l_pagefoot_image_clist{ \thepage }}};
    \node[font=\bfseries,] at ([shift={(-0.5,0.5)}]current~page.south~east){\thepage};
    \node[anchor=north~west] at ([shift={(3.5,2.8)}]current~page.south~west)
    {
      \begin{minipage}{\dimeval{\paperwidth-4.5cm}}
        \textcolor{red!50}{\faBook}\hskip .5em\tikz[baseline]{\node[anchor=base,rounded~corners,fill=red!50,inner~sep=.3mm]{物理学史};}\hskip 1em  \clist_item:Nn \l_pagefoot_text_clist { \thepage }
      \end{minipage}
    };
  \end{tikzpicture}
}
\ExplSyntaxOff
\Watermark
\pagestyle{empty}
\begin{document}
\zhlipsum[1]
\newpage
\zhlipsum[2]
\end{document}

效果如下:
第一页
1.png
第二页
2.png

附件:
pagefoot.zip

给一个较为简单的办法:
定义函数 \tzhmode 如下

\NewDocumentCommand{\tzhmode}{m}
{
  \str_case:nn {#1} 
  {
    {show}
    {
    \def\xsbxd{
      \int_step_inline:nnn{1}{3}{
      \noindent \seq_item:Nn \xsb_jianda{####1}\par
      \noindent \seq_item:Nn \xsb_xiangda{####1}\par
      }
    }
    }
    {hide}{\let\xsbxd\relax}
  }
}

再为 \enddocument 添加一个 hook,

\AtEndDocument
{
  \newpage
  \xsbxd
}  

即可.
完整 mwe 如下:

\documentclass{ctexart}
\ExplSyntaxOn

\seq_new:N \xsb_jianda
\seq_new:N \xsb_xiangda
\tl_new:N \c_teacher_mode_tl
\tl_set:Nn \c_teacher_mode_tl{详答}
\tl_new:N \c_printer_mode_tl
\tl_set:Nn \c_printer_mode_tl{简答}

\tl_new:N \g__tzhmode_tl

\NewDocumentCommand{\tzhmode}{m}
{
  \str_case:nn {#1} 
  {
    {show}
    {
    \def\xsbxd{
      \int_step_inline:nnn{1}{3}{
      \noindent \seq_item:Nn \xsb_jianda{####1}\par
      \noindent \seq_item:Nn \xsb_xiangda{####1}\par
      }
    }
    }
    {hide}{\let\xsbxd\relax}
  }
}



%创建解答环境
\NewDocumentEnvironment{solution}{s +b} %\begin{solution}*    \end{solution}       \begin{solution}         \end{solution}
{
  \tl_if_eq:NNTF \g_tzhmode_tl \c_teacher_mode_tl
  {
    \par
    \IfBooleanTF{#1}
    {
        ~#2
    }
    {
        ~#2
    }
  }{}
  \seq_gput_right:Nn \xsb_xiangda{#2 \par}
}
{

}

%创建答案命令
\NewDocumentCommand{\daan}{o +m}{
  \par
  \tl_if_eq:NNTF \g_tzhmode_tl \c_printer_mode_tl
  {
    \IfNoValueTF{#1}{~#2 \par }{~#2 \hspace{1cm} ~#1 \par }
  }
  {
    \tl_if_eq:NNT \g_tzhmode_tl \c_teacher_mode_tl
    {
      \IfNoValueTF{#1}{~#2 \par }{~#2 \hspace{1cm} ~#1 \par }
    }
  }
  \seq_gput_right:Nn \xsb_jianda{#2}
}


\NewDocumentCommand{\xsbjd}{}
{
  \seq_map_inline:Nn \xsb_jianda{##1}
}

\AtEndDocument
{
  \newpage
  \xsbxd
}  

\ExplSyntaxOff

\begin{document}
      \tzhmode{show}
    % \tzhmode{hide}
    \begin{enumerate}
        \item 这是第一题
        \daan{选A}
        \begin{solution}
            为什么选择A
        \end{solution}
        \item 这是第二题
        \daan{选B}
        \begin{solution}
            为什么选择B
        \end{solution}
        \item 这是第三题
        \daan{选C}
        \begin{solution}
            为什么选择C
        \end{solution}
    \end{enumerate}
\end{document}

请提供最小工作示例

使用 \node[] at (2,2) {$y=(x+1)-\frac{1}{3}e^x$}; 标注即可

有没有觉得你的需求有些奇怪)
在固定的盒子里面,你想放一个“漂浮”的物体(

好久没画图了,手生,将就一下吧

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{intersections,arrows.meta}
\begin{document}
\begin{tikzpicture}[>=Stealth]
  \draw[->] (-3,0) -- (3,0);
  \foreach \x in{20,30,40}
  \draw[->,name path=p\x] (0,0) -- (\x:3);
  \draw[name path=p50,domain=-2:2,smooth] plot (\x,0.5*\x*\x);
  \draw[name intersections={of=p20 and p50,name=i,total=\t},fill=white]
  {(i-2) circle (1pt)}; 
  \draw[name intersections={of=p30 and p50,name=i,total=\t},fill=white]
  {(i-2) circle (1pt)}; 
  \draw[name intersections={of=p40 and p50,name=i,total=\t},fill=white]
  {(i-2) circle (1pt)}; 
  \draw[name intersections={of=p20 and p50,name=i,total=\t},fill=white]
  {(i-1) circle (1pt)}; 
\end{tikzpicture}
\end{document}

QQ截图20220611112830.png

tex的计算能力有限,使用 l3fp 帮助计算

讨论见此 tikz用plot画图象报错dimension too large

另外需要加上 xmax=1e4 选项才能显示完整.

\documentclass[1pt]{standalone}
\usepackage{amsmath,amssymb,amsfonts}
\usepackage{euler}
%\usepackage{MnSymbol}
%\usepackage{stmaryrd}
\usepackage{xcolor}
%use xfp package
\usepackage{xfp}
\usepackage{pgfplots}
\usepackage{pgfplotstable}
\usepgfplotslibrary{colormaps}
\usetikzlibrary{pgfplots.groupplots,matrix}
\pgfplotsset{height=8cm,width=8cm}
\begin{document}
\begin{tikzpicture}
    \begin{loglogaxis}[
        enlargelimits=false,
        grid=both,
        ymin=5e-6,ymax=1,
        xmax=1e4,
        ymode=normal,
        xlabel= undulations per revolution(UPR),
        ylabel=amplitude transmission,
        log basis y=10,
        log basis x=10,
        domain=1e0:1e4,samples=60,smooth,
        ]
        % use \fpeval with xfp, x --> \x 
        \addplot+[no marks,ultra thick,black]{\fpeval{exp(((0.4697*1/15*\x)^2)*(-3.1415))}}; 
        \addplot+[no marks,ultra thick,black]{\fpeval{exp(((0.4697*1.25/50*\x)^2)*(-3.1415))}};
        \addplot+[no marks,ultra thick,black]{\fpeval{exp(((0.4697*1.5/150*\x)^2)*(-3.1415))}};
        \addplot+[no marks,ultra thick,black]{\fpeval{exp(((0.4697*1.75/500*\x)^2)*(-3.1415))}};
        \addplot+[no marks,ultra thick,red,opacity=0.8]{exp(((0.4697*2/1500*x)^2)*(-3.1415))};
    \end{loglogaxis}
\end{tikzpicture}
\end{document} 

3.png

发布
问题