![我的 chronosys 时间轴中部分透明的灰色 chronoevents?或者使用任何其他 Plain-TeX、LaTeX、LuaLaTeX 甚至 XeLaTex 包或方法?](https://linux22.com/image/328873/%E6%88%91%E7%9A%84%20chronosys%20%E6%97%B6%E9%97%B4%E8%BD%B4%E4%B8%AD%E9%83%A8%E5%88%86%E9%80%8F%E6%98%8E%E7%9A%84%E7%81%B0%E8%89%B2%20chronoevents%EF%BC%9F%E6%88%96%E8%80%85%E4%BD%BF%E7%94%A8%E4%BB%BB%E4%BD%95%E5%85%B6%E4%BB%96%20Plain-TeX%E3%80%81LaTeX%E3%80%81LuaLaTeX%20%E7%94%9A%E8%87%B3%20XeLaTex%20%E5%8C%85%E6%88%96%E6%96%B9%E6%B3%95%EF%BC%9F.png)
在组合“传统”时间线时,我拼凑了一种在 chronosys 中为我的框着色的方法,但我希望事件框是部分透明的。
这将允许更好的眼动追踪,特别是当事件相距很近且标记深度不同时。请参阅下面使用 Gimp 制作的模拟图,了解其外观。
如果文本与颜色框更好地对齐,那就更好了,请注意 Darwin 中的“s”和 Empire 中的“m-”。我的临时代码似乎可以工作,但会产生错误。 **(感谢 Kola B.,请参阅灰色与灰色)
代码如下:
\documentclass[letterpaper,12pt,landscape]{article}
\usepackage[T1]{fontenc}
\usepackage{chronosys}
\begin{document}
\subsection*{Biographical cornerstones}
\startchronology[startyear=1850,stopyear=1950,height=0.5ex]
\chronoevent[textwidth=4.5cm,colorbox={grey!10},markdepth=100pt]%
{1882}{born in the Austrian part of the Austria-Hungarian Empire}
\chronoevent[textwidth=4cm,colorbox={grey!10},markdepth=40pt]%
{1885}{Publication of Darwin's Evolutionary Theory}
\stopchronology
\end{document}
编译后的示例:
以下是一个粗略的模型:
这chronosys 文档没有提到透明度作为一种选择,但由于它使用 Tikz(用于绘制线条)和 colorbox(用于事件),我相信透明度是可能的。
我尝试了以下方法,尝试使用如何指定透明颜色根据 cfr 的参考:
\documentclass[letterpaper,12pt,landscape]{article}
\usepackage[T1]{fontenc}
\usepackage{chronosys}
\usepackage{transparent}
\begin{document}
\subsection*{Biographical cornerstones}
\startchronology[startyear=1850,stopyear=1950,height=0.5ex]
\chronoevent[textwidth=4.5cm,colorbox={gray!10},markdepth=100pt]%
{1881}{born in the Austrian part of the Austria-Hungarian Empire}
\chronoevent[textwidth=4cm,markdepth=40pt]%
{1885}{\transparent{0.3}\colorbox{blue}{Publication of Darwin's Evolutionary Theory}}
\stopchronology
\end{document}
但结果是这样的:
更改透明度会影响框的颜色,使其变亮或变暗,但不允许框变得更透明或更不透明。请注意,浅蓝色框中的文本非常模糊。当“透明度”被修改时,框内的文本也会变得更亮或更暗,这是不想要的副作用。
请告知是否存在使用其他时间线包的解决方案,除此之外,chronosys
我还想到实现目标的另一种方法是以某种方式使连接框的线半透明。解决方案应该能够反映事件的月份/日期/年份,并在时间线上自动水平放置事件。如果有人知道如何将 percusse 的答案变成 MWE,我们将不胜感激。答案是“纯 TeX”还是“Tikz”,是否需要多次编译,或者其他,只要它能工作就行。
为 @cfr 点赞,他提出的以下解决方案非常完美。他的解决方案制作的时间线类型与目前可用的 LaTeX/TeX 软件包(至少是我所知道的软件包)制作的时间线类型不同。
尽管提出了出色的解决方案,但拥有基于“包”的解决方案(无论是使用 chronosys 还是其他包)仍然很有帮助。
答案1
当前版本:克洛诺斯。
请报告错误在 codeberg 上。
这是基本版本。本质上,样式chronos
设置了基本时间线。chronos date
然后可用于获取该时间线上的适当点,从该点将线条拖放到事件节点。来自的信息chronos date
也可以在节点本身中使用。这里它用于打印节点内容之前的日期。
我使用循环来添加事件,但这只是为了节省输入。如果愿意,可以逐个添加。
基本时间线架构应如下布局:
\begin{tikzpicture}
[
chronos={%
<options>
},
]
<events and such on the timeline specified in the usual way>
\end{tikzpicture}
选项chronos
如下:
width=<dimension>
,height=<dimension>
,start date=YYYY-MM-DD
,end date=YYYY-MM-DD
,
默认情况下,时间线又1pt
高又100mm
宽,开始和结束日期都在上个千年的开始。
chronos date=YYYY-MM-DD
然后可以在图片中使用它来帮助将事物放置在时间线上。例如,我在下面的一个循环中使用它,如下所示,其中\i
保存当前迭代的日期,\j
保存文本并\k
保存偏移时间线下方节点的距离。
\path [postaction={draw=gray, -{Triangle[width=1.5pt,reversed,length=.75pt,fill=gray]}}, chronos date/.expanded={\i}] ({(\thechronosthingdate-\thechronosstartdate)*\chronosunit pt},0) -- +(0,-\k) node [anchor=north, fill opacity=.75, fill=gray!25, draw=gray, rounded corners, font=\footnotesize\sffamily] {\chronosthingday/\chronosthingmonth/\chronosthingyear\\\j};
chronos date
输入\i
日期,这将设置和。\thechronosthingdate
第一个是数字,可用于计算在时间线上放置事件的距离。这应该是\chronosthingyear
\chronosthingmonth
\chronosthingday
({(\thechronosthingdate-\thechronosstartdate)*\chronosunit pt},0)
\thechronosstartdate
保存与时间线开始日期相对应的数字,并\chronosunit
保存每天允许的长度(以点为单位)。这是在chronos
使用时根据开始和结束日期以及宽度计算得出的。每端允许 10pt 的偏移量,这样第一个日期就不会正好在开始处,最后一个日期也不会正好在结束处。
\chronosthingday
,\chronosthingmonth
并分别\chronosthingyear
保存设置的日、月、年chronos date
,如果需要,可以将其用于节点或标签的内容中。
将以下三元组输入到循环中(\i/\j/\k
)
{1001-11-05}/{No fireworks}/10pt
{1002-07-04}/{No fireworks}/80pt
{1002-05-01}/{May Day}/50pt
{1002-06-21}/{Summer Solstice}/10pt
因此得出
完整代码:
\documentclass[tikz,multi,border=10pt]{standalone}
\usepackage{datenumber}
\usetikzlibrary{arrows.meta}
\newcounter{chronosstartdate}
\newcounter{chronosenddate}
\newcounter{chronosstartyear}
\newcounter{chronosendyear}
\newcounter{chronosyeardate}
\newcounter{chronosthingdate}
\pgfkeys{/pgf/number format,
int detect,
set thousands separator={},
}
\tikzset{
chronos/.code={% https://tex.stackexchange.com/a/159856/ - Claudio Fiandrino
\tikzset{%
align=center,
anchor=mid,
/chronos/.cd,
#1
}%
\setstartyear{\chronosstartyear}%
\setmydatenumber{chronosstartdate}{\chronosstartyear}{\chronosstartmonth}{\chronosstartday}%
\setmydatenumber{chronosenddate}{\chronosendyear}{\chronosendmonth}{\chronosendday}%
\pgfmathsetmacro\chronosunit{(\chronoswidth-20pt)/(\thechronosenddate-\thechronosstartdate)}%
\draw [line width=\chronosheight] (-10pt,0) coordinate (chronos pre) -- +(\chronoswidth,0) coordinate (chronos post);
\coordinate (chronos start) at (0,0);
\coordinate (chronos end) at ([xshift=-10pt]chronos post);
\setcounter{chronosstartyear}{\chronosstartyear}%
\setcounter{chronosendyear}{\chronosendyear}%
\def\tempa{01}%
\ifx\chronosstartmonth\tempa
\ifx\chronosstartday\tempa
\else\stepcounter{chronosstartyear}%
\fi
\else\stepcounter{chronosstartyear}%
\fi
\def\tempa{12}%
\def\tempb{31}%
\ifx\chronosendmonth\tempa
\ifx\chronosendday\tempb
\stepcounter{chronosendyear}%
\fi
\fi
\foreach \i in {\thechronosstartyear,...,\thechronosendyear} {%
\setmydatenumber{chronosyeardate}{\i}{01}{01}%
\node [above, anchor=south] at ({(\thechronosyeardate-\thechronosstartdate)*\chronosunit pt},0) {\i}; }
},
chronos date/.code args={#1-#2-#3}{%
\tikzset{%
/chronos/.cd,
thing year={#1},
thing month={#2},
thing day={#3},
}%
\setmydatenumber{chronosthingdate}{\chronosthingyear}{\chronosthingmonth}{\chronosthingday}%
},
/chronos/.search also={/tikz},
/chronos/.cd,
start year/.store in=\chronosstartyear,
start month/.store in=\chronosstartmonth,
start day/.store in=\chronosstartday,
end year/.store in=\chronosendyear,
end month/.store in=\chronosendmonth,
end day/.store in=\chronosendday,
thing year/.store in=\chronosthingyear,
thing month/.store in=\chronosthingmonth,
thing day/.store in=\chronosthingday,
start date/.style args={#1-#2-#3}{%
start year={#1},
start month={#2},
start day={#3},
},
end date/.style args={#1-#2-#3}{%
end year={#1},
end month={#2},
end day={#3},
},
width/.store in=\chronoswidth,
height/.store in=\chronosheight,
start date=1001-10-01,
end date=1003-06-14,
width=100mm,
height=1pt,
chronos date=1850-01-01,
}
\begin{document}
\begin{tikzpicture}
[chronos]
\foreach \i/\j/\k in {{1001-11-05}/{No fireworks}/10pt,{1002-07-04}/{No fireworks}/80pt,{1002-05-01}/{May Day}/50pt,{1002-06-21}/{Summer Solstice}/10pt}
{%
\path [postaction={draw=gray, -{Triangle[width=1.5pt,reversed,length=.75pt,fill=gray]}}, chronos date/.expanded={\i}] ({(\thechronosthingdate-\thechronosstartdate)*\chronosunit pt},0) -- +(0,-\k) node [anchor=north, fill opacity=.75, fill=gray!25, draw=gray, rounded corners, font=\footnotesize\sffamily] {\chronosthingday/\chronosthingmonth/\chronosthingyear\\\j};
}
\end{tikzpicture}
\end{document}
答案2
这个问题时不时就会出现,我以为最终会有人进去,找到 TikZ 键并更改它......但是......有人能错到什么程度呢?
无论如何,作者做了一些极其保守的事情,并没有向 pgfkeys 屈服。因为为什么要让事情变得更容易?(顺便说一句,这是纯 TeX 用户的典型特征,尽管 pgfkeys 也可以在纯 TeX 中使用)。
因此,按照他的(一定是他)的步骤,我发现该框是一个颜色框,而不是 TikZ 节点。所以你的选择非常有限
- 作者修复了它
您开始定义一个选项,例如
\csname !chrverif\endcsname\gdef\csname !chr@eventopacity\endcsname{}% \csname !chrverif\endcsname\gdef\csname !chreventdefaultopacity\endcsname{1}%
然后将此选项放置在需要的位置,同时用透明组封装绘制框的部分(
% %AFFICHAGE
如果我没记错的话,从开始)。然后你会遇到一些奇怪的问题,例如pdflatex - 透明包似乎不起作用
恕我直言,这个包没什么用。编写您自己的简单 TikZ 包,您将在一两周内使用pgfkeys
基本语法恢复功能。一半的包代码重新发明了pgfkeys
选项解析(普通 TeX 用户的另一个特点)。另一季度基本上是装箱拆箱内容。
答案3
对我来说,用纯 TikZ 图片绘制“传记基石”比用 更简单chronosys
。使用tikzpicture
你会得到稍微多一点的代码,但是有了它,你就可以完全控制节点样式的自定义。例如:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{arrows.meta,positioning}
\begin{document}
\subsection*{Biographical cornerstones}
\begin{center}
\begin{tikzpicture}[
node distance = 0mm,
TN/.style args = {#1/#2}{% as Transparency Node
fill=#1,
fill opacity=#2,
text opacity=1, align=flush left,
inner sep=1mm, outer sep=0.25mm, below},
TN/.default = gray!50/0.5,
L/.style = {% as Line
draw=gray, line width=1mm,
{Bar[width=4mm,line width=0.4pt]}-{Bar[width=4mm,line width=0.4pt]}
}
]
\draw[L] ( 0,0) coordinate (s)
node[above=2mm] {1850} -- +
(10,0) node[above=2mm] {1950};
\draw (3.1,0) -- + (0,-2.4)
node (e1) [TN] {1881}
node (e1a) [TN,below=of e1] {born in the Austrian part\\
of the Austria-Hungarian\\
Empire};
\draw (3.5,0) -- + (0,-0.4)
node (e2) [TN=blue!30/0.3] {1885}
node (e2a) [TN=blue!30/0.7,
below=of e2] {Publication of Darwin's\\
Evolutionary Theory};
\end{tikzpicture}
\end{center}
\end{document}
得出: