
크기 조정 및 경로를 사용하여 도형에 텍스트를 그리려고 합니다. 텍스트가 다음과 같이 표시되기를 원합니다.
여러가지 방법을 시도해 봤는데 잘 안되더라구요. 다음과 같은 방법을 사용하여 가까이 다가갈 수 있습니다.
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{decorations.text}
\begin{document}
\pagenumbering{gobble}
\begin{tikzpicture}
\node (One) at (-15,0) {.};
\node (Two) at (15,0) {.};
\draw [decorate,decoration={text effects along path,
text={TTTTTTTTTTTTTTTT},
text align=center,
text effects/.cd,
path from text,
character count=\i, character total=\n,
characters= {text along path, scale=(2 + abs(\i - (\n / 2) - 0.5) * 1 )}}] (One) to (Two);
\end{tikzpicture}
\end{document}
결과는 다음과 같습니다.
표시된 예와 같이 텍스트 상단이 구부러지기를 원합니다.
답변1
\outline
나는 재미를 위해 매크로(pdflatex 필요)를 던졌습니다 .
내용 \outline
은 서문에 있고 네킹 코드는 기본 문서에 있습니다. 저는 원래 \outline
Malipivo에서 구성하는 코드를 훔쳤습니다 .TikZ: 텍스트 주위에 후광이 있나요?
내가 하는 일은 \mytext
텍스트가 포함된 \clipbox
상자 \cuts
( 각 컷에 를 적용하여 컷 번호와 최대 네킹 비율을 나타내는 \scalebox
의 함수로 텍스트를 축소했습니다 . \dip
여기서 선택한 기능은 포물선형이지만 다른 기능도 개발할 수 있습니다.
\documentclass{article}
\usepackage{ifthen,trimclip,calc,fp,graphicx,xcolor}
%%%%% FOR TEXT OUTLINING
\input pdf-trans
\newbox\qbox
\def\usecolor#1{\csname\string\color@#1\endcsname\space}
\newcommand\bordercolor[1]{\colsplit{1}{#1}}
\newcommand\fillcolor[1]{\colsplit{0}{#1}}
\newcommand\outline[1]{\leavevmode%
\def\maltext{#1}%
\setbox\qbox=\hbox{\maltext}%
\boxgs{Q q 2 Tr \thickness\space w \fillcol\space \bordercol\space}{}%
\copy\qbox%
}
\newcommand\colsplit[2]{\colorlet{tmpcolor}{#2}\edef\tmp{\usecolor{tmpcolor}}%
\def\tmpB{}\expandafter\colsplithelp\tmp\relax%
\ifnum0=#1\relax\edef\fillcol{\tmpB}\else\edef\bordercol{\tmpC}\fi}
\def\colsplithelp#1#2 #3\relax{%
\edef\tmpB{\tmpB#1#2 }%
\ifnum `#1>`9\relax\def\tmpC{#3}\else\colsplithelp#3\relax\fi
}
\bordercolor{blue}
\fillcolor{yellow}
\def\thickness{.5}
%%%%%
\begin{document}
\Huge
\edef\dip{.5}% percent to depress the amplitude
\def\cuts{200}% Number of cuts
\newsavebox\mytext
\savebox{\mytext}{\kern.3pt\textbf{\textsf{\outline{Valley Text}}}\kern.3pt}% TEXT
\newlength\clipsize
\FPeval{\myprod}{1/cuts}
\clipsize=\myprod\wd\mytext\relax
\newcounter{mycount}
\whiledo{\value{mycount}<\cuts}{%
\stepcounter{mycount}%
\edef\NA{\themycount}%
\edef\NB{\the\numexpr\cuts-\themycount\relax}%
\FPeval{\myprod}{1 - \dip*\NA*\NB*4/\cuts/\cuts}%
\clipbox{%
\value{mycount}\clipsize\relax{} %
-1pt %
\wd\mytext-\value{mycount}\clipsize-\clipsize\relax{} %
-1pt%
}{\scalebox{1}[\myprod]{\usebox{\mytext}}}%
}
\end{document}
코드 가 없으면 \outline
코드를 관리하기가 더 쉽습니다. (편집됨) 여기에서는 \parabtext[<mode>]{<lift>}{<neck>}{<cuts>}{<content>}
위의 몇 가지 추가 사항을 사용하여 매크로로 변환합니다 .
<mode>
좁은 중앙의 경우 0이고 좁은 끝의 경우 1입니다.
<lift>
변환 중 기준선의 부분 최대 리프트입니다.
<neck>
는 목 전체 높이의 부분적 감소입니다.
<cuts>
상자에 적용할 수직 슬라이스 수입니다(너무 작으므로 계단식으로 보입니다).
<content>
상자에 넣어서 변신하는 물건이에요.
\documentclass{article}
\usepackage{ifthen,trimclip,calc,fp,graphicx,xcolor}
\newsavebox\mytext
\newcounter{mycount}
\newlength\clipsize
\newcommand\parabtext[5][0]{%
\edef\neck{#3}% percent to depress the amplitude
\def\cuts{#4}% Number of cuts
\savebox{\mytext}{\kern.2pt#5\kern.2pt}% TEXT
\FPeval{\myprod}{1/cuts}%
\clipsize=\myprod\wd\mytext\relax%
\setcounter{mycount}{0}%
\whiledo{\value{mycount}<\cuts}{%
\stepcounter{mycount}%
\edef\NA{\themycount}%
\edef\NB{\the\numexpr\cuts-\themycount\relax}%
\FPeval{\myprod}{\NA*\NB*4/\cuts/\cuts}%
\ifnum0#1=0\relax%
\FPeval{\myprod}{1 - \neck*(\myprod)}%
\else%
\FPeval{\myprod}{1 - \neck*(1-\myprod)}%
\fi%
\clipbox{%
\value{mycount}\clipsize\relax{} %
-1pt %
\wd\mytext-\value{mycount}\clipsize-\clipsize\relax{} %
-1pt%
}{\raisebox{#2\dimexpr\ht\mytext-\myprod\ht\mytext}{%
\scalebox{1}[\myprod]{\usebox{\mytext}}}}%
}%
}
\begin{document}
\Huge\centering\def\X{\textbf{XXX}}%
\parabtext{0}{.7}{200}{\textbf{\textcolor{brown}{Valley Text}}}\par
\X\parabtext{0}{.7}{200}{\X}\parabtext[1]{0}{.7}{200}{\X}\X\par
\X\parabtext{1}{.7}{200}{\X}\parabtext[1]{1}{.7}{200}{\X}\X\par
\X\parabtext{.425}{.7}{200}{\X}\parabtext[1]{.425}{.7}{200}{\X}\X
\end{document}
가장 최근에 편집된 옵션인 <mode>
은 변환의 모양 함수를 변경합니다. 두 모드 모두에서 함수가 평가됩니다.
\FPeval{\myprod}{\NA*\NB*4/\cuts/\cuts}%
이는 상자 양쪽 끝의 값이 1이고 상자 중앙의 값이 0인 포물선입니다. 그런 다음 모드가 0이면 변환은 다음과 같습니다.
\FPeval{\myprod}{1 - \neck*(\myprod)}%
반면 0이 아닌 경우 변환은 다음과 같습니다.
\FPeval{\myprod}{1 - \neck*(1-\myprod)}%
이 간단한 차이로 인해 각각 넥 버전과 배럴 버전이 만들어집니다.
제안된 방법론
이 방법은 계산 비용이 다소 많이 들지만 Wow! 효과.
먼저 계산 비용이 조금 더 들 수 있지만 실제로 순방향 차이에서 중앙 차이로 가져오는 약간 수정된 코드를 보여 드리겠습니다.
하지만 제가 생각하는 가장 효과적인 방법은 사용자 정의 변수의 슬라이스 수를 낮은 숫자로 설정하고 \def\slices{5}
그에 따라 문서를 개발하는 것입니다. 최종 컴파일에서 최종 레이아웃에 모든 것이 설정되면 \def\slices
원하는 번호로 다시 돌아가서 {200}
마지막으로 다시 컴파일합니다.
\documentclass{article}
\usepackage{ifthen,trimclip,calc,fp,graphicx,xcolor}
\newsavebox\mytext
\newcounter{mycount}
\newlength\clipsize
\newcommand\parabtext[5][0]{%
\edef\neck{#3}% percent to depress the amplitude
\def\cuts{#4}% Number of cuts
\savebox{\mytext}{\kern.2pt#5\kern.2pt}% TEXT
\FPeval{\myprod}{1/cuts}%
\clipsize=\myprod\wd\mytext\relax%
\setcounter{mycount}{0}%
\whiledo{\value{mycount}<\cuts}{%
\stepcounter{mycount}%
\edef\NA{\themycount}%
\edef\NB{\the\numexpr\cuts-\themycount\relax}%
\FPeval{\myprod}{(\NA-.5)*(\NB+.5)*4/\cuts/\cuts}%
\ifnum0#1=0\relax%
\FPeval{\myprod}{1 - \neck*(\myprod)}%
\else%
\FPeval{\myprod}{1 - \neck*(1-\myprod)}%
\fi%
\clipbox{%
\value{mycount}\clipsize-\clipsize\relax{} %
-1pt %
\wd\mytext-\value{mycount}\clipsize\relax{} %
-1pt%
}{\raisebox{#2\dimexpr\ht\mytext-\myprod\ht\mytext}{%
\scalebox{1}[\myprod]{\usebox{\mytext}}}}%
}%
}
\begin{document}
\def\slices{200}
\Huge\centering\def\X{\textbf{XXX}}%
\parabtext{0}{.7}{\slices}{\textbf{\textcolor{brown}{Valley Text}}}\par
\X\parabtext{0}{.7}{\slices}{\X}\parabtext[1]{0}{.7}{\slices}{\X}\X\par
\X\parabtext{1}{.7}{\slices}{\X}\parabtext[1]{1}{.7}{\slices}{\X}\X\par
\X\parabtext{.425}{.7}{\slices}{\X}\parabtext[1]{.425}{.7}{\slices}{\X}\X
\end{document}
예를 들어 다음은 저해상도 컴파일에 대해 로 \slices
설정된 출력입니다 .5
XeLaTeX 사용자를 위한 참고 사항
OP는 이 접근 방식이 XeLaTeX에서 작동하지 않았다고 지적했습니다. 약간의 연구 끝에 문제를 패키지의 버그로 요약했습니다 trimclip
(xelatex에서 \scalebox의 \clipbox가 제대로 작동하지 않습니다.). Joseph Wright는 친절하게도 trimclip
XeLaTeX에서 실행할 때 문제를 진단하고 코드에 대한 패치를 제공했습니다 .
\makeatletter
\ifdefined\XeTeXversion
\def\@cliptoboxdim#1{%
\setbox #1=\hbox{%
\Gin@defaultbp\WIDTH{\wd #1}%
\Gin@defaultbp \DEPTH {\dp #1}%
\@tempdima \ht #1%
\advance\@tempdima\dp#1%
\Gin@defaultbp \TOTALHEIGHT {\@tempdima }%
\special{pdf:literal q}%
\special{pdf:literal 0 -\DEPTH \space \WIDTH \space \TOTALHEIGHT \space re W n }%
\rlap{\copy #1}%
\special {pdf:literal Q}%
\hskip\wd#1%
}%
}
\fi
\makeatother
답변2
업데이트
삼각형 메시를 사용하면 연속적인 변형을 대략적으로 계산할 수 있습니다.
\documentclass[border=9,tikz]{standalone}
\begin{document}
\pgfmathdeclarefunction{fx}{2}{\pgfmathparse{#1*(3+cos(#2*20))/3}}
\pgfmathdeclarefunction{fy}{2}{\pgfmathparse{#2*(3-cos(#1*20))/3}}
\pgfmathdeclarefunction{fxx}{2}{\pgfmathparse{fx(#1+1,#2)-fx(#1,#2)}}
\pgfmathdeclarefunction{fxy}{2}{\pgfmathparse{fy(#1+1,#2)-fy(#1,#2)}}
\pgfmathdeclarefunction{fyx}{2}{\pgfmathparse{fx(#1,#2+1)-fx(#1,#2)}}
\pgfmathdeclarefunction{fyy}{2}{\pgfmathparse{fy(#1,#2+1)-fy(#1,#2)}}
\tikz{
\path(-15,-15)(15,15);
\foreach\i in{-10,...,9}{
\foreach\j in{-10,...,9}{
\pgfmathsetmacro\aa{fxx(\i,\j)}
\pgfmathsetmacro\ab{fxy(\i,\j)}
\pgfmathsetmacro\ba{fyx(\i,\j)}
\pgfmathsetmacro\bb{fyy(\i,\j)}
\pgfmathsetmacro\xx{fx (\i,\j)}
\pgfmathsetmacro\yy{fy (\i,\j)}
\pgflowlevelobj{
\pgfsettransformentries{\aa}{\ab}{\ba}{\bb}{\xx cm}{\yy cm}
}{
\fill[black!10](1,0)--(0,0)--(0,1);
\clip(1,0)--(0,0)--(0,1)--cycle;
\tikzset{shift={(-\i,-\j)}}
\path(0,0)node{\includegraphics[width=20cm]{lena.png}};
}
\pgfmathsetmacro\aa{fxx(\i ,\j+1)}
\pgfmathsetmacro\ab{fxy(\i ,\j+1)}
\pgfmathsetmacro\ba{fyx(\i+1,\j )}
\pgfmathsetmacro\bb{fyy(\i+1,\j )}
\pgfmathsetmacro\xx{fx (\i+1,\j+1)}
\pgfmathsetmacro\yy{fy (\i+1,\j+1)}
\pgflowlevelobj{
\pgfsettransformentries{\aa}{\ab}{\ba}{\bb}{\xx cm}{\yy cm}
}{
\clip(0,0)--(-1,0)--(0,-1)--cycle;
\tikzset{shift={(-\i-1,-\j-1)}}
\path(0,0)node{\includegraphics[width=20cm]{lena.png}};
}
}
}
}
\end{document}
오래된 답변
@Steven B. Segletes의 아이디어를 복사하면 그리드는 2D이고 PGF/Ti에서 수행됩니다.케이지.
% !TEX program = XeLaTeX
% !TEX encoding = UTF-8 Unicode
\documentclass[border=9,tikz]{standalone}
\usepackage{fontspec}\setmainfont{Arial Unicode MS}
\begin{document}
\pgfmathdeclarefunction{fxx}{1}{\pgfmathparse{#1}}
\pgfmathdeclarefunction{fxy}{1}{\pgfmathparse{sin(222+30*#1)}}
\pgfmathdeclarefunction{fyx}{1}{\pgfmathparse{sin(20*#1)}}
\pgfmathdeclarefunction{fyy}{1}{\pgfmathparse{#1}}
\pgfmathdeclarefunction{gxx}{1}{\pgfmathparse{fxx(#1+1)-fxx(#1)}}
\pgfmathdeclarefunction{gxy}{1}{\pgfmathparse{fxy(#1+1)-fxy(#1)}}
\pgfmathdeclarefunction{gyx}{1}{\pgfmathparse{fyx(#1+1)-fyx(#1)}}
\pgfmathdeclarefunction{gyy}{1}{\pgfmathparse{fyy(#1+1)-fyy(#1)}}
\tikz{
\path(-2,-2)(103,23);
\foreach\i in{0,...,100}{
\foreach\j in{0,...,20}{
{
\pgfmathsetmacro\aa{gxx(\i)}
\pgfmathsetmacro\ab{gxy(\i)}
\pgfmathsetmacro\ba{gyx(\j)}
\pgfmathsetmacro\bb{gyy(\j)}
\pgfmathsetmacro\xx{fxx(\i)+fyx(\j)}
\pgfmathsetmacro\yy{fxy(\i)+fyy(\j)}
\pgflowlevelobj{
\pgfsettransformentries{\aa}{\ab}{\ba}{\bb}{\xx cm}{\yy cm}
}{
\clip(0,0)--(1,0)--(1,1)--(0,1)--cycle;
\draw[gray](1,0)--(0,0)--(0,1);
\path(-\i,-\j)+(50,10)node{\fontsize{500pt}{0}\selectfont Valley Text};
}
}
}
}
}
\end{document}
일부 수학
내 코드에서 변환은 다음과 같이 정의됩니다.
(x,y) |--> ( fxx(x)+fyx(y) , fxy(x)+fyy(y) )
fxx, fyx, fxy, fyy는 어디에 있나요?좋은기능. 이러한 변환은 정사각형을 평행사변형으로 보냅니다. 우연히도 PDF는 정사각형을 평행사변형으로 보내는 아핀 변환을 지원합니다. 따라서 조각별 아핀 변환을 사용하여 원래 변환을 근사화할 수 있습니다. 결과적으로 모든 곡선이 그대로 유지됩니다.연결됨, 비록 미분할 수는 없지만.