![关于后记中的函数的解释](https://linux22.com/image/250557/%E5%85%B3%E4%BA%8E%E5%90%8E%E8%AE%B0%E4%B8%AD%E7%9A%84%E5%87%BD%E6%95%B0%E7%9A%84%E8%A7%A3%E9%87%8A.png)
我尝试使用 pgf 从 bc-logo 创建一些符号。这些符号在 .mps 文件中定义。我遇到了一些困难
0 0.19284 dtransform truncate idtransform setlinewidth
pop [] 0 setdash 1 setlinejoin
10 setmiterlimit
我理解其中的一些部分,但我无法使用 pgf 系统基础层的某些命令翻译这个表达式。
关于这些功能:例如,可以用 pdflatex 编写和编译:
\includegraphics[height=3in]{/Users/ego/Desktop/latex/bclogo/latex/bc-dfrance.mps}
您可以在这里找到此文件:bc-徽标 因此,我认为 bc-dfrance.mps 中使用的 postscript 函数也是 PDF 函数。
我在这个文件中发现的另一个函数是rlineto
。我想知道在 PGF 的基本层中是否有等效函数(不在 tikz 中,因为我们可以使用相对坐标)
这是我工作的一部分,例如,我不能使用 scale=2 之类的东西,因为 \pgfsetlinewidth{10pt}
它们从未被修改过。我认为下面的代码对于设置线宽很有用。我需要对 做同样的事情\pgflinewidth
。这样对吗?
\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[dvipsnames]{xcolor}
\usepackage{tikz}
\begin{document}
\includegraphics[height=3in]{/Users/ego/Desktop/latex/bclogo/latex/bc-dfrance.mps}
\begin{tikzpicture}[scale=10]
\def\i{\pgfusepath{clip}}
\let\o\pgfpathclose
\let\s\pgfusepathqfillstroke
\def\f{\pgfusepath{fill}}
\def\p #1#2{\pgfqpoint{#1bp}{#2bp}}
\def\m #1 #2 {\pgfpathmoveto{\p{#1}{#2}}}
\def\r #1 #2 #3 #4 {\pgfpathrectangle{\p{#1}{#2}}{\p{#3}{#4}}}
\def\l #1 #2 {\pgfpathlineto{\p{#1}{#2}}}
\def\c #1 #2 #3 #4 #5 #6 {%
\pgfpathcurveto{\p{#1}{#2}}{\p{#3}{#4}}{\p{#5}{#6}}}%
\definecolor{cola}{rgb}{0,0.13672,0.58203}
\definecolor{colb}{rgb}{1,1,1}
\definecolor{colc}{rgb}{ 0.92578,0.16016,0.22266}
\definecolor{cold}{rgb}{ 0,0,0}
\m 69.29587 697.21698
\l 86.23233 697.21698
\l 86.23233 676.1185
\l 69.29587 676.1185
\i
\m 69.68298 690.30095
\l 69.68298 695.78268
\l 70.17444 695.84264
\l 70.63571 695.88812
\l 71.07422 695.91524
\l 71.4901 695.92976
\l 71.88321 695.93361
\l 72.25758 695.92297
\l 72.60909 695.90366
\l 72.94183 695.87366
\l 73.25937 695.832
\l 73.55804 695.78268
\l 73.84538 695.72556
\l 74.11375 695.66171
\l 74.37468 695.59395
\l 74.62419 695.52135
\l 74.86237 695.44586
\l 75.0929 695.36263
\l 75.31598 695.28323
\l 75.53151 695.19711
\l 75.71677 695.12451
\l 75.71677 684.15721
\l 75.53151 684.2288
\l 75.31598 684.31204
\l 75.0929 684.39526
\l 74.86237 684.4785
\l 74.62419 684.554
\l 74.37468 684.62659
\l 74.11375 684.69435
\l 73.84538 684.75821
\l 73.55804 684.81532
\l 73.25937 684.86472
\l 72.94183 684.90245
\l 72.60909 684.93631
\l 72.25758 684.95467
\l 71.88321 684.96631
\l 71.4901 684.96242
\l 71.07422 684.94794
\l 70.63571 684.91693
\l 70.17444 684.87534
\l 69.68298 684.81532
\pgfsetfillcolor{cola}%
\o
\f
\m 75.72807 689.63504
\l 75.74318 695.11388
\l 75.95117 695.03065
\l 76.15906 694.95132
\l 76.36316 694.87193
\l 76.56737 694.79259
\l 76.77525 694.72
\l 76.98703 694.65614
\l 77.19867 694.59222
\l 77.41798 694.539
\l 77.64485 694.49352
\l 77.87924 694.45193
\l 78.1212 694.42577
\l 78.37448 694.40639
\l 78.6391 694.40254
\l 78.91888 694.40639
\l 79.20999 694.42577
\l 79.51622 694.45576
\l 79.83754 694.50516
\l 80.1816 694.56902
\l 80.54076 694.64835
\l 80.65031 694.67451
\l 80.65031 683.70715
\l 80.54076 683.68105
\l 80.1816 683.59781
\l 79.83754 683.5378
\l 79.51622 683.48848
\l 79.20999 683.45456
\l 78.91888 683.43909
\l 78.6391 683.43135
\l 78.37448 683.43909
\l 78.1212 683.45847
\l 77.87924 683.48457
\l 77.64485 683.52232
\l 77.41798 683.5717
\l 77.19867 683.62392
\l 76.98703 683.68494
\l 76.77525 683.75264
\l 76.56737 683.82524
\l 76.36316 683.90463
\l 76.15906 683.98012
\l 75.95117 684.06335
\l 75.71677 684.15721
\pgfsetfillcolor{colb}%
\o
\f
\m 80.65031 689.19278
\l 80.65031 694.67451
\l 80.92256 694.74321
\l 81.3271 694.86035
\l 81.75052 694.9958
\l 82.20036 695.15163
\l 82.67673 695.32872
\l 83.1795 695.52519
\l 83.70882 695.74878
\l 84.26831 695.99463
\l 84.85811 696.2627
\l 85.48186 696.55788
\l 86.13591 696.88306
\l 86.13591 685.91187
\l 85.48186 685.59058
\l 84.85811 685.29533
\l 84.26831 685.02344
\l 83.70882 684.78148
\l 83.1795 684.55789
\l 82.67673 684.36142
\l 82.20036 684.18433
\l 81.75052 684.0285
\l 81.3271 683.89299
\l 80.92256 683.77591
\l 80.65031 683.70715
\pgfsetfillcolor{colc}%
\o
\f
\pgfsetlinewidth{2pt}% this is a problem when i scale the picture
\m 69.68298 690.30095
\l 69.68298 695.78268
\l 70.17444 695.84264
\l 70.63571 695.88812
\l 71.07422 695.91524
\l 71.4901 695.92976
\l 71.88321 695.93361
\l 72.25758 695.92297
\l 72.60909 695.90366
\l 72.94183 695.87366
\l 73.25937 695.832
\l 73.55804 695.78268
\l 73.84538 695.72556
\l 74.11375 695.66171
\l 74.37468 695.59395
\l 74.62419 695.52135
\l 74.86237 695.44586
\l 75.0929 695.36263
\l 75.31598 695.28323
\l 75.53151 695.19711
\l 75.74318 695.11388
\l 75.95117 695.03065
\l 76.15906 694.95132
\l 76.36316 694.87193
\l 76.56737 694.79259
\l 76.77525 694.72
\l 76.98703 694.65614
\l 77.19867 694.59222
\l 77.41798 694.539
\l 77.64485 694.49352
\l 77.87924 694.45193
\l 78.1212 694.42577
\l 78.37448 694.40639
\l 78.6391 694.40254
\l 78.91888 694.40639
\l 79.20999 694.42577
\l 79.51622 694.45576
\l 79.83754 694.50516
\l 80.1816 694.56902
\l 80.54076 694.64835
\l 80.92256 694.74321
\l 81.3271 694.86035
\l 81.75052 694.9958
\l 82.20036 695.15163
\l 82.67673 695.32872
\l 83.1795 695.52519
\l 83.70882 695.74878
\l 84.26831 695.99463
\l 84.85811 696.2627
\l 85.48186 696.55788
\l 86.13591 696.88306
\l 86.13591 685.91187
\l 85.48186 685.59058
\l 84.85811 685.29533
\l 84.26831 685.02344
\l 83.70882 684.78148
\l 83.1795 684.55789
\l 82.67673 684.36142
\l 82.20036 684.18433
\l 81.75052 684.0285
\l 81.3271 683.89299
\l 80.92256 683.77591
\l 80.54076 683.68105
\l 80.1816 683.59781
\l 79.83754 683.5378
\l 79.51622 683.48848
\l 79.20999 683.45456
\l 78.91888 683.43909
\l 78.6391 683.43135
\l 78.37448 683.43909
\l 78.1212 683.45847
\l 77.87924 683.48457
\l 77.64485 683.52232
\l 77.41798 683.5717
\l 77.19867 683.62392
\l 76.98703 683.68494
\l 76.77525 683.75264
\l 76.56737 683.82524
\l 76.36316 683.90463
\l 76.15906 683.98012
\l 75.95117 684.06335
\l 75.74318 684.14658
\l 75.53151 684.2288
\l 75.31598 684.31204
\l 75.0929 684.39526
\l 74.86237 684.4785
\l 74.62419 684.554
\l 74.37468 684.62659
\l 74.11375 684.69435
\l 73.84538 684.75821
\l 73.55804 684.81532
\l 73.25937 684.86472
\l 72.94183 684.90245
\l 72.60909 684.93631
\l 72.25758 684.95467
\l 71.88321 684.96631
\l 71.4901 684.96242
\l 71.07422 684.94794
\l 70.63571 684.91693
\l 70.17444 684.87534
\l 69.68298 684.81532
\pgfsetfillcolor{cold}%
\pgfusepath{stroke}%
\pgfsetlinewidth{10pt}% not fine big problem when I scale
\m 69.68298 676.50563
\l 69.68298 696.82983
\pgfusepath{stroke}
\end{tikzpicture}
\end{document}
由于我不理解某些函数,所以我对线条的宽度感到困惑。我无法正确缩放标志。我可以找到一种个人方法,但使用 pgf 命令直接翻译 postscript 函数会更容易。
答案1
dtransform
(增量变换)将用户的坐标(作为距离向量)转换为系统坐标,例如1 1 dtransform => -1.20570683 1.20570683
。它使用默认的变换矩阵[1.20570683 0.0 0.0 -1.20570683 0.0 954.0]
。
truncate
截掉堆栈上部值的小数部分但保留其为实数,例如:1.11 truncate => 1.0
idtransform
(逆 delta 变换)与 相反dtransform
,例如: -1.20570683 1.20570683 idtransform => 1 1
setmiterlimit
如果0 setlinejoin
两条线之间的夹角小于 15 度,则会出现问题。如果夹角小于 10 度,则将10 setmiterlimit
线切断(即)。2 setlinejoin
答案2
如果我们一步一步地执行命令
0 0.19284 dtransform truncate idtransform setlinewidth
pop [] 0 setdash 1 setlinejoin
10 setmiterlimit
我们取坐标 (0,0.19284) 并应用当前变换矩阵(不包括平移部分),即它等于应用 \pgftransform{a}{b}{c}{d}{\pgfpointorigin}
。然后得到的坐标将是(a.decimals, b.decimals)
,并且由于y
坐标在堆栈上的位置较高,因此会被截断,即结果将是(a.decimals,b)
。之后我们应用逆坐标变换来获得(c,d)
。y
坐标将再次用作线宽规范。
但请注意,这d=0
是允许的,并且会映射到1px
线宽。现在我不知道 TikZ 是否可以做到这一点,但作为一种解决方法,可以将零映射到非常细的线。
然后,由于使用了 y 坐标,我们在堆栈上只剩下一个数字,并且它会被命令丢弃pop
。setdash
命令需要一个数组和一个偏移量来设置一个非常像 TikZ 的虚线图案,因此空数组和 0 设置一条实线。
1 setlinejoin
line join=round
在 TikZ 中设置了 的等效值10 setmiterlimit
,据我所知,在 TikZ 中不可用。它基本上检查斜接是否导致角太尖锐,从而导致角太厚。手册第 690 页有一个很好的公式。
为什么有人想对剪贴画这样做?正如您在代码中提到的那样,原因可能是动态线宽缩放。例如,考虑以下两个简单情况:
\begin{tikzpicture}[scale=0.1]
\pgfgettransformentries{\mya}{\myb}{\myc}{\myd}{\myshiftx}{\myshifty}
\draw[fill=yellow,line width=\myd*0.05mm,draw=blue] (0,0) -- (0,1) -- (1,1) -- cycle;
\draw[fill=yellow,line width=0.05mm,draw=blue] (1.5,0) -- (1.5,1) -- (2.5,1) -- cycle;
\node[transform shape] at (1,1.5) {Scale = \myd};
\end{tikzpicture}
这给出
但是如果我们用相同的代码将比例改为 10,我们会得到
\begin{tikzpicture}[scale=0.1]
\pgfgettransformentries{\mya}{\myb}{\myc}{\myd}{\myshiftx}{\myshifty}
\draw[fill=yellow,line width=\myd*0.05mm,draw=blue] (0,0) -- (0,1) -- (1,1) -- cycle;
\draw[fill=yellow,line width=0.05mm,draw=blue] (1.5,0) -- (1.5,1) -- (2.5,1) -- cycle;
\node[transform shape] at (1,1.5) {Scale = \myd};
\end{tikzpicture}
我任意取了yscale
作为一个变量,但我们确实可以取一个坐标并将条目与变换条目相乘,以查看变换后它会去往何处,我0.05mm
最初选择 是因为它大致0.19284pt
与作者用来调整 PS 代码的方式相同。因此我们可以看到,一旦它太粗,与动态缩放的相比就会变得太细,这取决于缩放范围。还可以添加min
或max
案例,将 PS 的零线宽映射=1px
到 TikZ 的非零最小线宽,例如0.01pt
。
以下是两个并排的结果(左侧为 PS - 右侧为 Tikz):比例 = 10,1 和 0.1 的放大版本。左侧的版本有一个细杆,因此可以看到 1px 效果。
rlineto
可以通过像往常一样移动到某个点,然后将相对点添加到最后一个已知点来完成
\pgfpathmoveto{\pgfpoint{2cm}{4cm}}
\pgfgetlastxy{\macrox}{\macroy}
\pgfpathlineto{\pgfpointadd{\pgfpoint{\macrox}{\macroy}}{\pgfpoint{1cm}{-1cm}}}
\pgfusepath{stroke}
这将相当于\draw (2,4) -- ++ (1,-1)