JuliaMono-一种用于科学和技术计算的等宽字体

2020-10-18 22:29:27

这个页面最初是作为一个网站出现的,与JuliaMono的第一个版本相伴,现在它已经作为博客帖子合并到了这里。

JuliaMono是一种等宽字体,设计用于在Julia编程语言和其他文本编辑环境中进行编程,这些环境需要广泛的专业和技术Unicode字符。这是一个有趣的实验,将在葡萄牙里斯本举行的2020年JuliaCon会议上展示(当然,这不是在里斯本实际发生的,而是在网上发生的)。

最初的临时网站到处都使用JuliaMono,所以让我们试着让这个页面的其余部分也这样做。

使用zygote:@adjointfunction忽略(F)尝试返回f()catch e;返回0;endend@adjoint函数忽略(F)尝试zygote._̄(__CONTEXT__,f)捕获e 0,y CONTEXT->;NOT ENDEND。

JuliaMono有不同的权重,因此您可以控制突出显示代码中的对比度:JuliaMono-Light、JuliaMono-Regular、JuliaMono-Medium、JuliaMono-Bold、JuliaMono-ExtraBold和JuliaMono-Black。[3]。

(还有两种名称中包含“拉丁文”的字体的版本:这些是仅支持基本MacroMan/Windows1252“拉丁文”字符集的精简版本,主要用于作为占位符使用,主要是如果您希望更好地控制基于Web浏览器的应用程序中的字体加载时间。)。

在行家手中(如下面Julia代码片段[4]的作者Zygmunt Szpak博士),可用的Unicode字符的范围可能非常具有表现力:

函数T(𝛉::AbstractArray,𝒞::Tuple{AbstractArray,vararg{AbstractArray}},𝒟::Tuple{AbstractArray,vararg{AbstractArray}})⊗=kron l=Length(𝛉)𝐈ₗ=SMatrix{l,l}(1.0i)𝐈ₘ=SMatrix{1,1}(1.0i)𝐓=@SMatrix zeros(l,l)N=Length(𝒟[1])ℳ,ℳʹ=𝒟Λ₁,Λ₂=𝒞𝚲ₙ=@MMatrix zeros(4,4)𝐞₁=@SMatrix[1.0;0.0;0.0]𝐞₂=@SMatrix[0.0;1.0;0.0]For n=1:n INDEX=SVector(1,2)𝚲ₙ[1:2,1:2].=Λ₁[n][INDEX,INDEX]𝚲ₙ[3:4,3:4].=Λ₂[n][INDEX,索引]𝐦=hom(ℳ[n])𝐦ʹ=hom(ℳʹ[n])𝐔ₙ=(𝐦⊗𝐦ʹ)∂ₓ𝐮ₙ=[(𝐞₁⊗𝐦ʹ)(𝐞₂⊗𝐦ʹ)(𝐦⊗𝐞₁)(𝐦⊗𝐞₂)]𝐁ₙ=∂ₓ𝐮ₙ*𝚲ₙ*∂ₓ𝐮ₙ';𝚺ₙ=𝛉';*𝐁ₙ*𝛉𝚺ₙ⁻?=inv(𝚺ₙ)𝐓₁=@S矩阵零(Float64,l,l),k=1:l𝐞ₖ=𝐈ₗ[:,k]∂𝐞ₖ𝚺ₙ=(𝐈ₘ⊗𝐞ₖ';)*𝐁ₙ*(𝐈ₘ⊗𝛉)+(𝐈ₘ⊗𝛉';)*𝐁ₙ*(𝐈ₘ⊗𝐞ₖ)#在𝐓₁中累加结果会分配内存,#即使#SUM中的两个项都是数组。𝐓₁=𝐓₁+𝐔ₙ*𝚺ₙ⁻?*(∂𝐞ₖ𝚺ₙ)*𝚺ₙ⁻?*𝐔ₙ';*𝛉*𝐞ₖ';End𝐓=𝐓+𝐓₁End𝐓End

Ἄδμηθ‘,ὁρᾷςγὰρτἀμὰπράγμαθ’ὡςἔχει,λέξαιθέλωσοιπρὶνθανεῖνἃβούλομαι.。

Я,пазачътВальоужбди,аскришомхапвакюфтенцазадщайгите.。

“Dóna amor que seràs Feliç!”Aixó,il·lús company geniüt,jaés un llu it rètol Blavís d‘onze kWh.。

ZvlášťzákeřnèučeňsďolíčKy běžípodél zónyúlů。

VOIX歧义d‘un cœur qui au zéphyr préfère les jattes de kiwi。

Ταχίστηαλώπηξβαφήςψημένηγη,δρασκελίζειυπέρνωθρούκυνός.。

HĩlanDiagua kuñanguéra oho peteĩsaʼyju ypaʼũme Gavóme Omboʼe hag̃UA ingyleñeʼẽmitãnguéare neʼẽndyʼỹ.。

Jófoximés don Quijote húszwattos lámpánálülve Egy pár bűvös cipőt készít.

[ɢʷɯʔ.nas.doːŋ.Kʰlja][ŋAn.ȵʑI̯wo.ɕI̯uĕn.ɣWA]。

Ċuaiġbéṁórṡáċle dlúṫspád fíorḟinn tríhata moḋEA-ṗorcáinḃig.。

Muļķa hipiji mēģina brīvi nogaršot celofānažņaudzējčūsku.。

ĮlinkDama fechtuotojošpaga subykčiojui huręžėapvalųarbūzą.。

Ѕидарскипејзаж:шугавбилмезсочудењеџвакаќофтеикељнатуѓцех.。

Pchnąćw tęłódźjeża lub ośm skrzyń图.。

Lís ArgüiaàJúlia que braçáes,fé,chá,óxido,pôr,zângão»ERAM palavras do Português。

Широкаяэлектрификацияюжныхгубернийдастмощныйтолчокподъёмусельскогохозяйства.

Ајшо,лепотоичежњо,заљубавсрцамогадођиуХаџићенакафу.。

本杰明·皮迪奥纳·贝比达·德·奇维·弗鲁拉;Noé,sin Vergüenza,la más Champaña del menú。

Чуєшїх,доцю,га?Кумеднажти,прощайсябезґольфів!

JuliaMono的目标之一是包含一个典型程序员理所当然会找到的大多数字符。(除了所有这些表情符号-它们最好由操作系统处理。)。以下是随机选择的一千个左右:

在JuliaMono中,每个字符的宽度都相同,因为这是等宽字体。通常,带有大量Unicode数学符号的字体不是等宽字体,因为它们旨在用于散文和\(\LaTeX\)应用程序,而不是用于编程代码。

从设计的角度来看,将每个字符强制放入相同大小的框中是一个问题。这就像是让每个人都可以坐在相同的飞机座椅上,不管是什么形状或大小--有些角色看起来肯定会不舒服。从来没有足够的空间容纳漂亮的“m”或“w”。

(当然,大小不是一切-质量可以胜过数量,其他字体会提供不同的体验[8])。

支持框绘制字符和DataFrames.jl输出(终端允许)也是一个好主意:

Julia>;DF=DataFrame(A=样本,B=字形)df=10×2 DataFrame│Row│A│B│││String│String│├─┼─┼─┤│1│▁▂▁▁▂▄▅▁▄▁▁▅▆▂▇▅▂▇││1│Sample 2│▁▂▄▁▁▃▁▆▂▆▃▁▂▃▂▇▄││。3│示例3│▁▆▇▁▃▇▇▆▅▅▄▇▇▅▅▇▄▂││4│示例4│▅▁▄▁▆▃▁▃▇▂▂▇▅▇▃▆▃▁││5│示例5│▆▂▁▂▇▆▃▅▅▄▆▇▄▇▆▁▇││6│示例6│▁▁▇▂▂▇▃▅▂▂▆▂▄▄▁▄▂▇▆││7│示例7│▂▃▂▁▁▇。▁▂▆▂▁▇▁▄▃▂▁▄││8│示例8│▄▄▁▂▄▁▅▁▅▁▂▂▇▂▁▃▄▄││9│示例9│▁▁▁▂▁▆▃▄▄▁▂▂▃▂▁▅▁▆▃││10│示例10│▁▇▄▂▅▃▇▁▇▇▆▄▇▅▄▂▄▅▄│。

如果想知道是否可以在Julia代码中使用Unicode字符作为标识符,请使用未记录的函数Base.isidentifier()。因此,例如,如果您想要使用dingbat(经典的Herman Zapf dingbat设计之一),您可以在下面的输出中寻找合适的东西:

Julia>;for n in 0x2700:0x27bf Base.isidentifier(String(Char(N)&;&;打印(字符(N))end✀✁✂✃✄✅✆✇✈✉✊✋✌✍✎✏✐✑✒✓✔✕✖✗✘✙✚✛✜✝✞✟✠✡✢✣✤✥✦✧✨✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽✾✿❀❁❂❃❄❅❆❇❈❉❊❋❌❍❎❏❐❑❒❓❔❕❖❗❘❙❚❛❜❝❞❟❠❡❢❣❤❥❦❧➔➕➖➗➘➙➚。➛➜➝➞➟➠➡➢➣➤➥➦➧➨➩➪➫➬➭➮➯➰➱➲➳➴➵➶➷➸➹➺➻➼➽➾➿julia>;❤=println(";i❤$&34;)❤(带1个方法的泛型函数)julia>;❤(";julia&34;)i❤julia。

JuliaMono是一种OpenType字体。OpenType技术提供强大的文本定位、模式匹配和字形替换特性,这些特性对于阿拉伯语和乌尔都语等语言至关重要。在英语中,当某些字体中的字母对(如fi)被替换为单个字形(如fi)时,经常会看到opentype功能。自从活字印刷发明以来,这些连字就一直在使用,用更好看的替代方案取代了偶尔出现的笨拙的字符组合。

老实说,我对它们在字体编码中的使用并不是很感兴趣(而且我也不是唯一的一个[9])。我喜欢看到我输入的内容,而不是字体决定替换它的内容。但是,在Julia的一些地方,合适的Unicode替代方案不被语言接受,我觉得当前使用的ASCII艺术糖果可以通过明智地使用替代字形来轻微增强。在一些地方,一些细微的调整可以增强语言的可读性,而不会带来歧义。

Julialang=true#(!=0)(x,y)->;(x+y)f(p::int)=p*p@inbound if f in(Base.:+,Base.:-)if any(x->;x<;:AbstractArray{<;:Number})名词=dict(Base:+=>;";加法";,Base:-=>;";减法";,)enddf2=DF|>;@groupby(_.a)|>;@map({a=key(_),b=means(_.b)})|>;DataFrame#<;|。

OpenType字体还允许您为某些字符选择不同的设计。这些被存储为“样式集”。

所有选项都存储在字体中,并且通常由其内部的四个字母代码引用(真的不是最好的面向用户的设计)。例如,上面列出的上下文替换项集中存储在CALT功能中。

有时,应用程序会在字体面板[11]中更直观地显示选项,通常隐藏在字体选择器对话框中的某个位置。

所有这些花哨的技术都在您正在使用的应用程序和操作系统的控制之下。理想情况下,它们将为您提供一种简单的方式来打开和关闭各种OpenType功能。

基于浏览器的编辑器(如Juno和VS Code)在其编辑器窗口中支持许多OpenType特性,但在终端/控制台窗口中不支持。它们提供了一个设置区域,您可以在其中键入CSS或JSON选择器来控制特性的外观,并且您必须知道特性代码。有些功能是选择加入的,而另一些则是选择退出的;这也可能因应用程序的不同而不同。

终端/控制台应用程序也有很大不同;在MacOS上,终端和iTerm应用程序试图提供对OpenType功能的控制,并取得了不同程度的成功。在Linux上,一些终端应用程序(如Kitty)提供了相当好的支持,但其他应用程序(如Alacritty)到目前为止几乎没有提供任何支持。[12]。

如果应用程序允许,您应该能够关闭CALT上下文连字,特别是因为相当多的人不会喜欢他们的代码中的任何一个。对于下面的清单,我使用CSS关闭了CALT集合(请参见此处),然后启用一些可选的样式集:将字符(如0、g、a、j和@)与前面的清单进行比较:

Julialang=true#(!=0)(x,y)->;(x+y)f(p::int)=p*p@inbound if f in(Base.:+,Base.:-)if any(x->;x<;:AbstractArray{<;:Number})名词=dict(Base:+=>;";加法";,Base:-=>;";减法";,)enddf2=DF|>;@groupby(_.a)|>;@map({a=key(_),b=means(_.b)})|>;DataFrame#<;|。

(我最初喜欢更圆形的@标志的想法,但实际上它在小字体尺寸下不起作用,因为细节消失了。但不管怎样,我都留着它。)。

Unicode系统中有几个区域已正式保留为空,因此可用于存储不属于该标准的字符。这些区域称为专用区域,有三个区域:\ue000到\uf8ff、\UF0000到\UFFFFD和U100000到U+10FFFD。

在这些方面,每种字体都可以做自己的事情。例如,在JuliaMono中,如果您环顾一下\ue800,您会发现一些熟悉的形状:

在专用区域使用字符的明显缺点是,除非它们已转换为轮廓或位图,否则您必须将字体安装在希望它们正确呈现的任何位置。如果字体没有安装(例如在GitHub上),你不知道会显示什么字形(如果有的话)。

您可以将这些定义为在Julia REPL上可用。例如,假设您希望在julia会话中键入\julialogo并激活juliaMono字体时,终端中可以使用julia Circle。运行以下命令:

通常可以将Unicode值直接键入文本。当你不使用Julia REPL时,这是一项很有用的技能…。在MacOS上,在按住Option(⌥)键的同时键入四个十六进制数字(确保您使用的是Unicode十六进制输入键盘)。在Windows上,我认为您可以输入四个十六进制数字,然后是Alt,然后是X。在Linux上,可能是ctrl-Shift-u,然后是十六进制数字。

要安装并激活字体,请从应用程序文件夹启动Font Book,然后将字体文件拖到标记为Font的中间窗格中。如果你正在使用不同的字体管理器,你已经知道该怎么做了。:)。

要在Windows上安装并激活字体,请转到计算机|>;本地磁盘(C:)|>;Windows|>;字体。找到展开的.zip文件夹,并将字体文件从该文件夹拖到Fonts文件夹中。

并将文件复制到那里。您可能希望(或必须)重新生成字体缓存:

这种字体是在葡萄牙里斯本举行的2020年Julia编程语言大会(JuliaCon)上推出的,它(将)是我对庆祝活动的贡献。这是一项实验,目的是看看是否可以在头脑中使用特定的编程语言来设计字体。

它包含Julia文档的Unicode输入章节中使用的所有字形(表情符号除外)。

该字体包含一些特殊功能,如上下文替代、样式集和“连字”,以补充Julia语法。

你可以访问朱莉娅博客的这面镜子。它已经有一段时间没有更新了(在Franklin.jl开发期间很有用),但是所有的代码示例都使用JuliaMono。

你可以浏览这本朱莉娅旧手册的本地副本。默认的Roboto-Mono字体已替换为JuliaMono-Regular。

这不是问题!但我明白你的意思。工作环境选择(编辑器、字体、配色方案、背景音乐、首选饮料等)。这在很大程度上是个人的事情,在您使用特定设置的几个小时、几天和几周内,您会逐渐习惯它,而不熟悉的工作环境会看起来没有吸引力,甚至很难看。您可能需要尝试其他选择一段时间,然后才能更习惯它们。幸运的是,您不必使用Comic Code、Kakoune编辑器、Autechre的音乐、榴莲茶或其他任何新的和陌生的东西;只需坚持您当前最喜欢的!

找到相关的CSS文件,并添加一个指向服务器上存储的WOFF2的链接。例如:

这将使用jsDelivr CDN(内容分发网络)访问当前版本的常规字体。

您可能更喜欢从您自己的服务器提供WOFF/2字体。您可能会遇到一个与跨域资源共享有关的问题,在某些浏览器上,这会阻止一个网页从另一个网页下载字体。

在VS-Code中,您可以在迷宫(但谢天谢地是可搜索的)设置部分找到字体设置。

要控制上下文和样式替代项的显示,请单击JSON中的编辑设置,然后查找editor.fontLigatures:

这使用功能代码(此处列出)。这些都应该在一行中打开或关闭。

或者,如果您只是不喜欢上下文替换,更喜欢斜杠零、简单的g和较浅的星号,请使用以下命令:

这是个好问题。“出于安全原因”,如今有些浏览器甚至不愿让您访问自己本地磁盘上的内容。但是该字体的本地副本可能在您的特定设置中可用和访问。

如果没有,您可以尝试使用Web字体,如上所述。例如,如果这里有一个Jupyter CSS文件:

@FONT-FACE{FONT-FACE:JuliaMono-Regular;src:url(";https://cdn.jsdelivr.net/gh/cormullion/juliamono/webfonts/JuliaMono-Regular.woff2";);}.rendered_html表{FONT-SIZE:16px!Important;}div.input_Area{Background:#def!Important;FONT-Size:16px!Important;}.CodeMirror{FONT-SIZE:16px!Important;Font-Family:";JuliaMono-Regular";!Important;FONT-Feature-Settings:";零";,";SS01";;字体变体连字:上下文;}。

另一个很棒的问题。您确定要在绘图上使用等宽字体吗?如果您这样做了,那么在打印时询问字体应该很容易。但是,它永远不会像您希望的那样简单,这在字体世界中是很常见的。

一些后端使用字体做他们自己的事情。例如,我根本无法说服GR后端使用JuliaMono。

以下是使用JuliaMono进行绘图的一些代码。该图显示了Julia git存储库中使用的每个Unicode字符的出现频率,并使用这些字符作为绘图标记。我检查了每个文本文件,计算了所有字符的总数-有956044个字母“e”,以此类推。我使用pylot();freqs DataFrame保存字符和计数。我已经使用Plots.font()创建了几个字体对象,这使得在lot()函数中使用不同的文本样式变得更容易。我还没有弄清楚如何使用字体系列的不同粗细。

使用绘图,Plots.PlotMeasurespyplot()theme(:dark)juliamonofont8=Plots.font(Family=";JuliaMono";,8,Halign=:Center,Colorant";White&34;)juliamonofont12=Plots.font(Family=";JuliaMono";,12,Halign=:Center,Colorant";White";)juliamonofont80=Plots.font(Family=";JuliaMono";,80,Halign=:Center,Colorant";grey30&34;)Annotation=";在Julia源文件";p=Plot(1:100,freqs[1:100,2],FontFamily=";JuliaMono";,March=20 mm,y Axis=:log10,Annotation=[(50,1000,Plots.text(Annotation,juliamonofont12),(80,1_000_000,Plots.text(";";,juliamonofont80)],line Width=0.25,Series_Annotation=Plots.text.(freqs[1:100,1],Ref(Juliamonofont8)),xLabel=";←较频繁|较不频繁→&34;,yLabel=";出现次数(对数刻度)";,labelfontsize=6,title_fontsize=14,格式化=:普通,大小=(800500),标题=";前100个字符\n在Julia GitHub存储库中显示(P)。

前9个字符“etanirsol”与典型的英语频率计数(如“etarionsh”)非常匹配。不出所料,括号在这里表现得非常好。

尽管Julia文档中出现了3600多个唯一字符,但其中大约3000个字符只出现一次。除了JuliaMono中没有的表情符号之外,所有的表情符号都可以绘制出来,但长尾在视觉上并不是很有趣。

要想绘制表情符号,你必须深入到Plots系统的内部。

请注意,y轴标签位于随matplotlib提供的DejaVu Sans中。这是因为:log10缩放代码执行自己的\(\latex\)-y操作,忽略当前字体。然而,至少我能够成功地插入Julia徽标,因为它是JuliaMono字体的一部分。

在\(\LaTeX\)文档中,您应该能够定义和使用本地字体。

Robert Moss提供了一个出色的软件包,可帮助您协商在使用Unicode和\(\LaTeX\)时可能遇到的各种字体问题:

这取决于你是指网页字体还是指“桌面”字体。Web字体有两种风格,.WOFF和.WOFF2,其中2表示较新且稍微紧凑的格式。JuliaMono-Regular.woff是674KB,JuliaMono-Regular.woff2是619KB-大概是一个PNG图像的大小。

作为比较,Julia手册(以及从v0.21开始使用Documenter.jl构建的每个手册)的.CSS文件的主题文件夹大约为700KB。因此,在这种情况下,WOFF2字体并没有那么糟糕。当然,每个Julia文档(Lato和Roboto)下载的两种Google字体都很小,只有14KB和11KB,每种字体都有221个字形。

因此,如果您正在构建一个网站,或者为移动应用程序进行设计,WOFF2文件的大小将是衡量拥有可预测字符集的优势的一个重要因素。请注意,您可以使用Unicode范围特性在CSS中指定字体子集,该特性定义了一组您知道要使用的受限字符集,这样用户就不会下载他们不需要的任何字符集。

您可以考虑使用‘-拉丁语’变体来避免初始加载时间。

当然,您是对的,有很多编码字体,它们都非常适合用Julia和大多数其他语言进行编程。比较两种不同的字体,关键在于细微的相似和不同之处有多重要。也许使用一种字体,您会看到偶尔出现的空框或奇怪的替换,而不是您所希望的字符。或者,有时您可能不喜欢特定的字形。

不过,更有可能的是,一种新字体的整体“感觉”--太窄、太宽、太密、太轻、太古怪、太单调、太一致、太多变--是个人品味问题,不受客观衡量的影响。JuliaMono的设计目标--易读、易用、不怪异、简单--意味着形状不会被压缩或压缩。它不是很时髦的薄。由于宽敞的空间,它可能会感觉相当“通风”

.