如何模拟 TikZ 中 \node 的一些选项

如何模拟 TikZ 中 \node 的一些选项

在此处输入图片描述

代码

\documentclass{article}
\usepackage{tikz} 
\begin{document}
\begin{tikzpicture} 
  \foreach \a in {0,45,...,315}%
   {\node[line width = 0pt,
          rotate     = \a,
          anchor     = west,
          inner sep  = 0pt,
          opacity    = .5]{\rule{.5cm}{.1cm}};}%      
\end{tikzpicture}    
\end{document}

\rotatebox我想用和得到相同的结果,\put但是无需 TikZ 即可使用其他有趣的方法

第一个代码的一些解释:

  1. anchor = west如果我们想把规则放在同一点,这是最重要的
  2. inner sep = 0pt删除规则周围的空白(> 0pt -> 漂亮的图片)
  3. line width = 0p微妙!如果没有这个,中心会出现一个小白点
  4. opacity = .5只是观察规则是如何制定的。

第一次尝试

\documentclass{article}
\usepackage{tikz} % I keep TikZ because `foreach` is useful  
 \begin{document}

 \begin{picture}(0,0)
       \foreach \a in {0,45,...,315}%
      {\put(0,0){\rotatebox[origin=l]{\a}{\mbox{\rule{.5cm}{.1cm}}}}}%    
 \end{picture}
\end{document} 

在此处输入图片描述

这是正常的,因为盒子放错了地方,我们可以看看为什么如果我们删除put

在此处输入图片描述

我是一个认真的人,所以我发现 这个问题以及一些好的和有用的答案所以......

第二次尝试

\documentclass{article}
\usepackage{tikz} 
\makeatletter
\newcommand{\somespecialrotate}[3][]{%
    \begingroup
    \sbox\@tempboxa{\rotatebox[#1]{#2}{#3}}%
    \@tempdima=-\wd\@tempboxa 
    \advance\@tempdima by 0.09cm  % this is one of the problem
    \mbox{\hskip\@tempdima\usebox\@tempboxa}%
    \endgroup}%
\makeatother    
\begin{document}      
\begin{picture}(0,0)
       \foreach \a in {-90,-45,...,90}%
      {\put(0,0){\rotatebox[origin=l]{\a}{\mbox{\rule{.5cm}{.1cm}}}}}%  
       \put(0,0){\somespecialrotate[origin=l]{180}{\mbox{\rule{.5cm}{.1cm}}}}% 
       \put(0,0){\somespecialrotate[origin=l]{135}{\mbox{\rule{.5cm}{.1cm}}}}%
       \put(0,0){\somespecialrotate[origin=l]{225}{\mbox{\rule{.5cm}{.1cm}}}}%     
 \end{picture}
\end{document} 

在此处输入图片描述

这看起来不错,但\advance\@tempdima by 0.09cm并不严重,如果我与第一个代码进行比较

在此处输入图片描述

\documentclass{article}
\usepackage{tikz} 
\makeatletter
\newcommand{\somespecialrotate}[3][]{%
    \begingroup
    \sbox\@tempboxa{\rotatebox[#1]{#2}{#3}}%
    \@tempdima=-\wd\@tempboxa 
    \advance\@tempdima by 0.09cm  % this is one of the problem
    \mbox{\hskip\@tempdima\usebox\@tempboxa}%
    \endgroup}%
\makeatother    
\begin{document}  
\begin{picture}(0,0)
       \foreach \a in {-90,-45,...,90}%
      {\put(0,0){\rotatebox[origin=l]{\a}{\mbox{\rule{.5cm}{.1cm}}}}}%  
       \put(0,0){\somespecialrotate[origin=l]{180}{\mbox{\rule{.5cm}{.1cm}}}}% 
       \put(0,0){\somespecialrotate[origin=l]{135}{\mbox{\rule{.5cm}{.1cm}}}}%
       \put(0,0){\somespecialrotate[origin=l]{225}{\mbox{\rule{.5cm}{.1cm}}}}%     
 \end{picture}%
\color{red}%
\begin{tikzpicture} [overlay]
\foreach \a in {0,45,...,315}%
   {\node[rotate=\a,anchor=west,inner sep=0pt,opacity=.5]{\rule{.5cm}{.1cm}};}%      
\end{tikzpicture} 
\end{document} 

我的问题put如何用和 得到相同的图片rotatebox

答案1

非 tikz 尝试解决方案(但\foreach为了方便而保留)。

首先,最好使用一个空的框,因为这样更容易想象。

为此,我将使用\fbox带有 的fboxsep,提供一些空填充。我们还将使用旋转package

\documentclass{article}
\usepackage{pgffor} % I keep TikZ because `foreach` is useful  
\usepackage{rotating}
\fboxsep10pt
\def\transparentbox{\fbox{\hbox to 3cm{}}}
\parindent0pt
\begin{document}
\foreach \a in {0,45,...,315}{%
\turnbox{\a}{\transparentbox}}%
\end{document} 

在此处输入图片描述

答案2

部分回答,因为我遇到了一些其他问题。我尝试了 Martin 提出的这个代码, \mbox{\hskip\dimexpr -.5\wd\bxb+.5\bxc\relax\usebox\bxc}但遇到了两个问题。第一个我引入了一些错误,因为结果非常糟糕,但如果我使用经典方法

\@tempdima=\wd\bxb 
\advance\@tempdima by -\wd\bxc  % this is one of the problem 
\@tempdima=-0.5\@tempdima 
\mbox{\hskip\@tempdima\usebox\bxc}%  

更新在 Werner 的帮助下采用了 Martin 的建议。`dimexpr' 非常有用。现在我需要减少此代码(三个循环,三个不同的宏)。

\documentclass{article}
\usepackage{picture}
\usepackage{tikz} 
\makeatletter 
\newbox\bxb
\newbox\bxc
\newcommand{\somespecialrotate}[3][]{%
\begingroup
    \sbox\bxb{#3}
    \sbox\bxc{\rotatebox[#1]{#2}{#3}}%
    \mbox{\hskip\dimexpr -.5\wd\bxb+.5\wd\bxc\relax\usebox\bxc}
\endgroup}% 
\newcommand{\somespecialrotatei}[3][]{%
\begingroup
    \sbox\bxb{#3}
    \sbox\bxc{\rotatebox[#1]{#2}{#3}}%
    \mbox{\hskip\dimexpr 0.5\wd\bxb-1.5\wd\bxc\relax\usebox\bxc}
\endgroup}%
\newcommand{\somespecialrotateii}[3][]{%
\begingroup
    \sbox\bxb{#3}
    \sbox\bxc{\rotatebox[#1]{#2}{#3}}%
    \mbox{\hskip\dimexpr -0.5\wd\bxc\relax\usebox\bxc}  
\endgroup}%   
\makeatother    
\begin{document} 

 \setlength{\fboxsep}{0pt}  
\begin{picture}(0,0)
       \foreach \a in {-45,0,45}%
      {\put(0,0){%
      \somespecialrotate[origin=l]{\a}{%
             \tikz \node[minimum width =2cm,%
                         minimum height=4mm,%
                         inner sep =0pt,draw,%
                         line width=.4pt]{};%
}}}%      
       \foreach \a in {135,180,225}%
      {\put(0,0){%
      \somespecialrotatei[origin=l]{\a}{%
             \tikz \node[minimum width =2cm,%
                         minimum height=4mm,%
                         inner sep =0pt,draw,%
                         line width=.4pt]{};%
}}}%
       \foreach \a in {90,-90}%
      {\put(0,0){%
      \somespecialrotateii[origin=l]{\a}{%
             \tikz \node[minimum width =2cm,%
                         minimum height=4mm,%
                         inner sep =0pt,draw,%
                         line width=.4pt]{};%
}}}%     
 \end{picture}%
\end{document}  

在此处输入图片描述

相关内容