![数学では](https://rvso.com/image/328834/%E6%95%B0%E5%AD%A6%E3%81%A7%E3%81%AF.png)
私はすでに TikZ に精通しており、TikZ が技術的に十分ではないかのように技術的な回答を探していることに注意してください。
この質問は、次の質問につながります。これらの違いは何ですか?
\def\pointA{\pgfpoint{0cm}{0cm}}
\coordinate (A) at (current page.north east);
\coordinate (A) at (1,1);
(current page.north east)
\node [anchor=east] {}
<-- アンカー? :-p(用語の重複を示すだけです)\pgfpointanchor
<-- しかし、これは本当にアンカーなのでしょうか、それともポイントなのでしょうか? :-p
私の理解が不足しており、それが以下に示す私の試みを妨げていると思います。
数学では
あポイントと定義されている:
点とは、平面上の正確な位置または場所のことです。点は物ではなく場所であることを理解することが重要です。
あ座標と定義されている:
座標は、点の位置を定義する順序付けられた一連の数値です。
アンカーとは次のようなものです。
これを実際の例で説明したいと思います。
座標を定義しましょう:
\coordinate (rightmid) at ($ (current page.north east) + (0,-18cm) $); % use tikz calc library
次のような暗黙的な座標 (座標、ポイント、アンカーなどと呼ぶべきでしょうか?) が多数あります。
- (現在のページ。北西)
- (現在のページ.北)
- (現在のページ。北東)
- (現在のページ.東)
- (現在のページ.南東)
- (現在のページ.南)
- (現在のページ.南西)
- (現在のページ.中央)
2 つの物体間の垂直距離を計算し (意図的に「物体」という言葉を選択しています)、この変数を現在のスコープ外での使用のために保存するとします。
例えば、2つのものは(現在のページ.北東)と(右中央)です。
計算を行うには、次のオプションを知っています (これがすべてですか?):
\pgfmathparse
算数を評価するために使用できる構文を使用できます
\path let \p1=
。
オプション 1 を使用すると、計算で 、 を に設定し、 で結果を\pgfxa
取得できます。\pgfya
\pgfx
\pgfy
\pgfmathresult
次に、 などの一意の長さ (グローバル) を定義できます\setlength{\mylength}{2cm}
。その後、 を使用してそれを取得できます。 は1 回しか定義できない\mylength
ため、すべてを自己完結型マクロに記述することはできません。別の方法としては を使用する方法があり、こちらの方が適していると思われます (間違っていたら訂正してください。これは値 + 単位/次元に影響しますか)。\setlength
\global\let\mylength{2cm}
すべてを一緒に入れて
- ある TikZ ノードの幅を使用して別のノードの幅を計算することは可能ですか?
- 座標を pgfpoint に変換するにはどうすればよいでしょうか。またその逆はどうすればよいですか。
- 座標A、B: |BA|と+xと(BA)の間の角度を計算する
- ノードを返すpgfマクロ
これは実験ですコンパイルされないいくつかの回答に基づいて:
\documentclass{article}
\usepackage{fontspec}
\usepackage{tikz}
\usetikzlibrary{calc}
% A4 Paper
\pdfpagewidth=210mm \pdfpageheight=297mm % for PDF output
\paperwidth=210mm \paperheight=297mm % for TikZ
\newcommand{\getdistance}[3]{
\makeatletter
% Syntax: <length variable/macro> <coordinate1> <coordinate2>
\pgfpointdiff{\pgfpointanchor{#2}{center}} % https://tex.stackexchange.com/a/39325/13552
{\pgfpointanchor{#3}{center}} % https://tex.stackexchange.com/a/39325/13552
\pgf@xa=\pgf@x
\pgf@ya=\pgf@y
\pgfmathparse{veclen(\pgf@xa,\pgf@ya)}
\global\let#1\pgfmathresult % <-- I want the pgfmathresult to be a dimension like 510 pt
\makeatother
}
\begin{document}
\begin{tikzpicture}[overlay]
\coordinate (rightmidtest) at ($ (current page.north east) + (0,-10cm) $); % use tikz calc library
\coordinate (rightmid) at ($ (current page.north east) + (0,-18cm) $); % use tikz calc library
\end{tikzpicture}
\getdistance{\globalresult}{rightmidtest}{rightmid}
\getdistance{\globalresult}{current page.north east}{rightmid}
\getdistance % <-- Should expand to last distance measured
\end{document}
コード更新 2016-02-25働く
percusse さんの回答を分析し、新たな理解を得た後、私は別のことを思いつきました。
覚えて:
(current page)
暗黙的である- アンカー .center は TikZ では暗黙的ですが、PGF では暗黙的ではありません
\pgfpointanchor{<ref>}{<anchor e.g. center>}
xparse
読みやすいのでマクロに構文を使用しました。
\documentclass{article}
\usepackage{fontspec}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{xparse}
\makeatletter
\NewDocumentCommand{\getdistance}{ m m O{center} m O{center} }{%
%Syntax: {\<macro>} {<ref1>} [<anchor>] {<ref2>} [<anchor>]
\pgfpointdiff{\pgfpointanchor{#2}{#3}}% https://tex.stackexchange.com/a/39325/13552
{\pgfpointanchor{#4}{#5}}% https://tex.stackexchange.com/a/39325/13552
\pgf@xa=\pgf@x
\pgf@ya=\pgf@y
\pgfmathparse{veclen(\pgf@xa,\pgf@ya)} % result as number (floating point)
%\pgfmathveclen{\pgf@xa}{\pgf@ya} % alternate syntax to pgfmathparse: result as number (floating point)
%\global\let#1\pgfmathresult pt % does not recognize pt.
\global\edef#1{\pgfmathresult\ pt}
%\pgfmathprintnumber{\pgfmathresult}%
}
\makeatother
\begin{document}
\begin{tikzpicture}[remember picture,overlay]
% (current page) is implicit
% .center is implicit in TikZ but not in PGF \pgfpointanchor{<ref>}{<anchor e.g. center>}
\coordinate (referral1) at ($ (current page.north east) + (0,-18cm) $); % use tikz calc library
\node [minimum height=2cm] (referral2) {};
\end{tikzpicture}
\begin{tikzpicture}[remember picture,overlay]
\getdistance{\globalresultA}{current page}{referral1}
\getdistance{\globalresultB}{current page}[north east]{referral1}
\getdistance{\globalresultC}{current page}[north east]{referral2}[north]
\getdistance{\globalresultD}{current page}[north east]{referral2}[south]
\end{tikzpicture}
\globalresultA
\globalresultB
\globalresultC
\globalresultD
\end{document}
答え1
混乱の原因は、TikZ がオブジェクトではなく参照を扱うという事実にあると思います。特定のノード名a
が言及されている場合、通常、ユーザーはおそらくその中心座標を意味していると想定されます。または、2 つのものの間にものを描画する場合、そのうちの 1 つがノードであれば、その境界上の点が魔法のように計算されるため、ユーザーは気付きません。
しかし、これらはすべて内部で行われます。ノードなどとは何の関係もありません。ノードには参照できる名前と、ノードが理解できる定義済みの場所があります。
これらはいずれも保存されません。単に存在がチェックされるか、実行されるだけです。言い換えると、 と書くとshape=duck
、すべての可能なシェイプ名を調べるのではなく、単に のような存在チェックを行うだけです (実際のマクロには意味のない名前を使用しています)
\pgfutil@ifdefined\pgf@Shape@#1@...{<if it exists use>}{<if not err>}
アンカーも同様で、 と言うと、 someなどanchor=heel
を介してその名前が要求されます。\pgf@sh@#1@anchor@#2
\savedanchor
では、これらはどこから来るのでしょうか? これらは、\anchor
などを介してシェイプ宣言で定義されます。
それらはそこにあり、細心の注意を払って配置されているため、参照すると、テキストボックスの幅や高さからシェイプのパスまですべてが苦労して手動でコーディングされています。そのため、新しいシェイプを定義するのは非常に面倒な作業です。また、参照すると、アンカーの位置が長さレジスタ内に(グローバルに!)書き込まれるように配置されます。\pgf@<x,y>
とにかく、長い話を短くすると、ノード アンカーを参照するとき、実際にそこから座標を取得するにはかなり複雑な手順があります。
さらに、 である座標\pgf@<x,y>
と である座標型ノードとの間には違いがあります\coordinate
。
最後に、ノードを参照するとき、TikZ は、キーストロークを節約できるように、その中心のアンカーを意味していると想定して支援しようとしますが、場合によっては、距離測定などのより細かい操作を行う必要があります。
参照名では済まされません。実際の座標が必要です (これも\coordinate
s ではありません)。Mark Wibrow がコメントしたように、何らかの方法でコンテキストを理解する必要があり、それは\pgf@process
次のような質問に答えるために を介して行われます: リテラル座標か(1,1)
、ノード名か、ノード アンカーかなど。その後、結果の\pgf@<x,y>
レジスタを使用できます。
その後、それらを使って好きなことを何でもできます。あなたの例のlet
構文もこれを単純化する素晴らしい仕事をしていますが、それでもあなたが説明したことを行っています。実際、あなたの質問は基本的に、なぜ TikZ が PGF 上に存在するのかということです。これは、非常に冗長ですが強力な PGF 構文の非常によく設計されたフロントエンドです。
答え2
\def\pointA{\pgfpoint{0cm}{0cm}}
PGF(チタンの基礎)に精通している場合にのみ使用してください。けZ)。いずれにしても、TeXで何が実行されるかは重要ではありません\pgfpoint
。このコマンドは単独では存在しません。通常は構文の一部です。たとえば、
\coordinate (A) at (current page.north east);
点に名前を付けます。実際の x 座標と y 座標が何であるかは重要ではありません。点がどこに(A)
あるかがわかっていれば、それだけで十分です。
\coordinate (A) at (1,1);
前の項目と似ています。通常、(A) コードの長さや複雑さを削減し、(B) 読みやすさを向上させることがポイントになります。例えば
(current page.north east)
括弧付きの場合、へ引っ越すアクション。ペンを持って、次に何かを描きたい場所に手を動かすのとよく似ています。例えば
このコードはTiけZ はペンをキャンバスの周囲に移動させ、ノード/座標を宣言します。
\node [anchor=east] {}
ペンの現在の位置の「近く」にノードを配置します。「近く」とは、指定するアンカーがペンの位置と一致することを意味します。これは、ボートに乗っているときに、アンカーを好きな場所に投げると、そのアンカーがボートを固定するのとよく似ています。
実践部分
- 必要です
\makeatletter
。 - または
\pgfmathsetlength
の代わりにが必要になるでしょう。\pgfmathsetmacros
\pgfmathparse
- ただし、使用前にすべてのディメンションを宣言する必要があることに注意してください。
- ノードを使用するときは注意してください
(current page)
。通常は、 が必要です[overlay]
。 tikzpicture
環境内で作成したものを取得するには、環境内にいる必要がありますtikzpicture
。- 同じ環境で作業を行っていない場合は
tikzpicture
、 が必要です[remember picture]
。
- 同じ環境で作業を行っていない場合は
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\makeatletter
\newcommand{\getdistance}[3]{
% Syntax: <length variable/macro> <coordinate1> <coordinate2>
\pgfpointdiff{\pgfpointanchor{#2}{center}} % http://tex.stackexchange.com/a/39325/13552
{\pgfpointanchor{#3}{center}} % http://tex.stackexchange.com/a/39325/13552
\pgf@xa=\pgf@x
\pgf@ya=\pgf@y
\pgfmathparse{veclen(\pgf@xa,\pgf@ya)}
\global\let#1\pgfmathresult % <-- I want the pgfmathresult to be a dimension like 510 pt
}
\begin{document}
\begin{tikzpicture}[remember picture,overlay]
\coordinate (rightmidtest) at ($ (current page.north east) + (0,-10cm) $); % use tikz calc library
\coordinate (rightmid) at ($ (current page.north east) + (0,-18cm) $); % use tikz calc library
\end{tikzpicture}
\tikz[remember picture,overlay]{
\getdistance{\globalresulta}{rightmidtest}{rightmid}
\getdistance{\globalresultb}{current page}{rightmid}
}
\globalresulta
\globalresultb
\end{document}
答え3
\def\pointA{\pgfpoint{0cm}{0cm}}
これは基本的に
\coordinate (A) at (0,0);
\coordinate (A) at (current page.north east);
ここでは、ページの右上隅に という名前を付けています
A
。場所にはすでに名前が付いているので意味がありませんが、そのすべてを入力しなくても とだけ入力できるので便利ですA
。\coordinate (A) at (1,1);
TikZの座標は基本的に の
coordinate
形をしたノードであり、キャプションを必要とせず、特に重要なことに がありませんsep
。つまり、これはポイントです。それでも、\node[coordinate] (a) at (0,0) {};
次のように書くと\coordinate (a) at (0,0);
(current page.north east)
これは、現在の「ページ」の右上隅を示します。通常は A4 ページですが、任意のサイズにすることができます。この場合のページは、必ずしも通常の紙を指すわけではなく、任意の指定された領域を指すことができます。
\node [anchor=east] {}
<-- アンカー?いいえ、これはアンカーではありません。設計されたアンカーを座標に配置することで位置が決定されるノードです。したがって、アンカーが座標と一致する
\node [anchor=east] at (4,0) {};
ノードを配置します。east
(4,0)
答え4
古い回答を編集する方法がわかりません。単に新しい回答を書きます。
ティけZ ポイントを指定する方法は多数あります
数値座標を指定します。
たとえば(1,2)
、、、、。(3mm,4in,5pt)
(6:7)
(axis cs:x=8)
定義済みのノード名とアンカー名を指定します。
たとえば(current page.south east)
、(current bounding box.north west)
。定義済みのノード名を指定します。
たとえば(current page)
、これは次のものと同等です。(current page.center)
定義済みの を指定します
coordinate
。
たとえば\coordinate(X)at(1,2);\path(X);
、 はcoordinate
実際にはノードであり、そのアンカーは「消えます」。(X)
、(X.center)
、(X.south)
、 は(X.34)
すべて同じ結果になります。
PGFのカウンターパートは
\pgfpointxy
、\pgfpointxyz
、\pgfpointpolar
、 等々\pgfpointanchor{#1}{#2}
\pgfpointanchor{#1}{center}
\pgfpointanchor{#1}{center}
の定義では\getdistance
、ノード名のみを入力でき、アンカーはcenter
必須として選択されていることがわかります。したがって、
\getdistance{\globalresultb}{current page.north east}{rightmid}
current page.north east
はノードではないためコンパイルされません。しかし
\coordinate (A) at (current page.north east);
\getdistance{\globalresultb}{A}{rightmid}
(A)
はノードの名前なのでコンパイルされます。
どのような入力を処理できるかはあなた次第です\getdistance
。例えばTiではけZ は、と の\tikz@parse@node
両方を処理できますが、 は処理できません。より一般的には、 と は、、および を処理します。さらに一般的には、は を処理できます。いずれか 1 つを選択する必要があります。(X)
(Y.Z)
(1,2)
\tikz@@scan@@no@calculator
(X)
(Y.Z)
(1,2)
\tikz@@@scan@@absolute
($ (current page.north east) + (0,-10cm) $)