我曾尝试仅基于几个参数创建 PSTricks 图形,但遇到了问题。
代码
\documentclass{article}
\usepackage{auto-pst-pdf,pstricks-add}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new_eq:NN
\calc
\fp_eval:n
\ExplSyntaxOff
% Parameters
\def\radius{1.5 }
\def\doublelayers{2}
\def\columns{2}
\begin{document}
\begin{figure}[htbp]
\def\diameter{\calc{2*\radius}}
\def\distance{\calc{2*3^(1/2)*\radius}}
\def\width{\calc{(2*\columns+1)*\radius}}
\def\height{\calc{(2+3^(1/2)*(\doublelayers-1))*\radius}}
\centering
\begin{pspicture}(\width,\height)
\rput(\radius,\radius){
\multido{\rC=0+\diameter}{\columns}{
\multido{\rD=0+\distance}{\doublelayers}{
\psdot(\rC,\rD)
\pscircle(\rC,\rD){\radius}
}
}
}
\rput(!2 \radius mul 1 3 sqrt add \radius mul){
\multido{\rE=0+\diameter}{\columns}{
\multido{\rF=0+\distance}{\doublelayers}{
\psdot(\rE,\rF)
\pscircle(\rE,\rF){\radius}
}
}
}
\end{pspicture}
\end{figure}
\end{document}
该文件应使用
pdflatex -shell-escape <filename>.tex
问题
如何将代码从使用更改\doublelayers
为使用单身的层数?重点是,如果有 2n 层,则应该在最左边绘制 n 层,并且 n 层缩进\radius
;如果有 2n-1 层,则应该在左边绘制 n 层,并且 n-1 层缩进。
例子:如果我有三层,代码应该从图形的左侧开始绘制两行圆圈,并在中间绘制一行圆圈,缩进。
下图显示了 2 个双层。如果是 3 个单层,则顶行不应该存在。
更新
我已经转发了这篇文章到LaTeX 社区因为这个帖子似乎已经“死了”,所以我去那里试试。
答案1
我实在不明白你在要求什么。
这就是你所要求的吗?
如果是上图的情况,有一个非常简单的解决方案:
\documentclass{article}
\usepackage{auto-pst-pdf,pstricks-add}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new_eq:NN
\calc
\fp_eval:n
\ExplSyntaxOff
% Parameters
\def\radius{1.5 }
\def\doublelayers{3}
\def\columns{2}
\pagestyle{empty}
\begin{document}
\begin{figure}[htbp]
\def\diameter{\calc{2*\radius}}
\def\distance{\calc{2*\radius}}%{\calc{2*3^(1/2)*\radius}}
\def\width{\calc{(2*\columns+1)*\radius}}
\def\height{\calc{(2+3^(1/2)*(\doublelayers-1))*\radius}}
\centering
\begin{pspicture}(\width,\height)
\rput(\radius,\radius){
\multido{\rC=0+\diameter}{\columns}{
\multido{\rD=0+\distance}{\doublelayers}{
\psdot(\rC,\rD)
\pscircle(\rC,\rD){\radius}
}
}
}
% \rput(!2 \radius mul 1 3 sqrt add \radius mul){
% \multido{\rE=0+\diameter}{\columns}{
% \multido{\rF=0+\distance}{\doublelayers}{
% \psdot(\rE,\rF)
% \pscircle(\rE,\rF){\radius}
% }
% }
% }
\end{pspicture}
\end{figure}
\end{document}
您是否要求一些或多或少动态的东西,以便您可以指定您想要的层数?
好的。我想我更了解你想要什么了。这是 MWE。它需要一些改进,但我现在很累。我明天再回来。
\documentclass{article}
\usepackage{xcolor}
\usepackage{auto-pst-pdf,pstricks-add}
\usepackage{expl3}
\ExplSyntaxOn
\cs_new_eq:NN
\calc
\fp_eval:n
\ExplSyntaxOff
% Parameters
\def\radius{0.75 }
\def\doublelayers{5}
\newcounter{bluedoublelayers}
\ifodd\doublelayers\relax%
\setcounter{bluedoublelayers}{\number\numexpr\doublelayers-1\relax}%
\else%
\setcounter{bluedoublelayers}{\doublelayers}%
\fi
\def\columns{2}
\pagestyle{empty}
\begin{document}
\begin{figure}[htbp]
\def\diameter{\calc{2*\radius}}
\def\distance{\calc{2*3^(1/2)*\radius}}
\def\width{\calc{(2*\columns+1)*\radius}}
\def\height{\calc{(2+3^(1/2)*(\doublelayers-1))*\radius}}
\centering
\begin{pspicture}(\width,\height)
\rput(\radius,\radius){
\multido{\rC=0+\diameter}{\columns}{
\multido{\rD=0+\distance}{\doublelayers}{
\psdot(\rC,\rD)
\pscircle(\rC,\rD){\radius}
}
}
}
\rput(!2 \radius mul 1 3 sqrt add \radius mul){
\psset{linecolor=blue}
\multido{\rE=0+\diameter}{\columns}{
\multido{\rF=0+\distance}{\thebluedoublelayers}{
\psdot(\rE,\rF)
\pscircle(\rE,\rF){\radius}
}
}
}
\end{pspicture}
\end{figure}
\end{document}
当设置doublelayers
为时2
,结果是:
当设置doublelayers
为时3
,结果是: