Apple - Text Attribute Programming Topics

本文翻译整理自:Text Attribute Programming Topics(更新日期:2004-02-16
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/TextAttributes/TextAttributes.html#//apple_ref/doc/uid/10000088i


文章目录

  • 一、文本属性简介
    • 1、谁应该阅读此文档
    • 2、本文件的组织
    • 3、另见
  • 二、关于文本属性
    • 1、角色属性
      • 存储字符属性
      • 属性固定
    • 2、临时属性
    • 3、段落属性
    • 4、雕文属性
    • 5、文档属性
  • 三、设置文本属性
    • 1、字距
    • 2、结扎
  • 四、访问属性
    • 1、检索属性值
    • 2、有效和最大范围
  • 五、更改属性字符串
    • 1、修改属性
    • 2、修复不一致
  • 六、纯文本和富文本对象
  • 七、RTF文件和属性字符串
    • 1、读写RTF数据
    • 2、苹果的RTF扩展


一、文本属性简介

重要提示: 本文档不再更新。
有关Apple SDK的最新信息,请访问留档网站。

文本属性描述了Cocoa文本系统维护的与文本相关的属性。
文本属性为段落和文档提供富文本和其他格式信息的区别特征。


1、谁应该阅读此文档

您应该阅读本文档以了解文本系统中不同类型的文本属性,特别是如果您直接处理属性字符串并且需要了解文本系统如何管理它们的属性。

要理解本文档中的信息,您应该事先了解文本系统的功能和架构,以及基本的Cocoa编程约定。


2、本文件的组织

本文档包括以下文章:

  • 关于文本属性介绍并定义了Cocoa中使用的五种文本相关属性。
    它还提供了对更详细留档的交叉引用。
  • 设置文本属性说明了如何使用NSTextView及其超类NSText的方法以编程方式设置文本视图对象中显示的文本属性。
  • 访问属性描述了与属性字符串一起存储的属性,并解释了如何操作它们。
  • 更改属性字符串描述了可用于更改NSMutableAttributedString的字符和属性的方法。
    本文还讨论了属性修复。
  • 纯文本和富文本对象讨论文本对象识别的富文本格式(RTF)标准的文本属性。
  • RTF文件和属性字符串解释了如何读取和写入RTF文件的字符和文档属性。

3、另见

有关详细信息,请参阅以下文档:

  • 文本系统存储层概述 提供了有关文本系统如何存储和操作文本的更多信息。
  • 属性字符串编程指南 提供了有关文本字符串和属性的更详细信息。

二、关于文本属性

Cocoa文本系统处理五种文本属性:字符属性、临时属性、段落属性、字形属性和文档属性。
字符属性包括字体、颜色和下标等特征,这些特征可以与单个字符或一系列字符相关联。
临时属性是仅适用于特定布局且不持久的字符属性。
段落属性是缩进、制表符和行距等特征。
字形属性影响布局管理器呈现字形的方式,并包括过度突出前一个字形等特征。
文档属性包括文档范围的特征,如纸张大小、边距和视图缩放百分比。


1、角色属性

文本系统将字符属性存储在属性字符串中,以及它们所应用的字符。
文本系统的预定义字符属性控制字符的外观(字体、前景色、背景色和连线处理)及其位置(上标、基线偏移和字距调整)。

两个特殊字符属性与链接和附件有关。
链接属性指向一个URL(封装在NSURL对象中)或您选择的任何其他对象。
附件属性与一个特殊的附件字符相关联,并指向一个NSFileWrapper对象,其中包含附加的文件或内存数据。

两个预定义的字符属性,NSCharacterShapeAttributeNameNSGlyphInfoAttributeName,很少使用,但为了完整起见在这里描述。
NSCharacterShapeAttributeName使您能够为Apple Type Services字体渲染中使用的字符形状功能设置一个值。
此功能目前用于指定中文和日文脚本中的传统形状,但字体开发人员也可以将其用于其他脚本。

在OS X 10.2及更高版本中,预定义字符属性NSGlyphInfoAttributeName指向一个NSGlyphInfo对象,该对象提供了一种覆盖标准字形生成过程并在属性范围内替换指定字形的方法。


存储字符属性

属性字符串将字符属性作为键-值对存储在NSDicword对象中。
键是一个属性名称,由一个标识符(NSString常量)表示,例如NSFontAttributeName
图1显示了一个属性字符串,其中属性字典应用于字符串中的范围。

图1包含其属性字典的NSA属性字符串的组成

在这里插入图片描述


从概念上讲,属性字符串中的每个字符都有一个关联的属性字典。
然而,通常情况下,属性字典适用于较长范围的字符。
NSAtsubtedString类提供了获取字符索引并返回关联的属性字典及其属性值应用的范围的方法。
有关使用这些方法的更多信息,请参阅 访问属性。

除了预定义的属性之外,您还可以分配任何属性键值对您希望为一系列字符。
您可以将属性添加到NSTextStorage中的适当字符范围对象使用NSMutableAttributedString 的 addAttribute:value:range:方法。
您还可以创建一个包含一组自定义属性的名称和值的NSDicizard,并使用addAttributes:range:方法将它们添加到字符范围。
要使用您的自定义属性,您需要NSLayoutManager的自定义子类了解如何处理它们。
您的子类应该覆盖drawGlyphsForGlyphRange:atPoint:方法首先调用超类来绘制字形范围,然后在顶部绘制您自己的属性,或者完全按照您自己的方式绘制字形。


属性固定

编辑属性字符串可能会导致不一致,必须通过属性修复来清除。
Application Kit 扩展 NSMutableAttributedString 定义fix...方法来修复附件、字体和段落属性之间的不一致。
这些方法确保附件在其附件字符被删除后不会保留,字体属性仅适用于该字体中可用的字符,并且段落属性在整个段落中保持一致。

有关字符属性和属性修复的更多详细信息,请参阅 属性字符串编程指南


2、临时属性

临时属性是不与属性字符串一起存储的字符属性。
相反,布局管理器在布局过程中分配临时属性,并仅在绘制文本时使用它们。
例如,您可以使用临时属性为拼写错误的单词下划线或为编程语言中的关键字着色。

临时属性只影响文本的外观,而不影响它的布局方式。
您可以使用与常规字符属性相同的键或使用自定义属性名称(如果您有一个NSLayoutManager子类可以处理它们)将临时属性存储在NSDicword中。
然后,您可以使用NSLayoutManager方法添加属性,例如addTemporaryAttributes:forCharacterRange:
默认情况下,唯一识别的临时属性是那些影响颜色和下划线的属性。
在布局过程中,临时属性取代常规字符属性。
因此,例如,如果一个字符有一个存储的NSForegroundColorAttributeName值指定蓝色和一个相同标识符的临时属性指定红色,那么该字符将呈现为红色。

有关临时属性的更多信息,请参阅NSLayoutManager参考留档。


3、段落属性

段落属性影响布局管理器将文本行排列成页面上段落的方式。
文本系统将段落属性封装在NS😍raphStyle类的对象中。
预定义字符属性之一的值NSParagraphStyleAttributeName,指向包含该字符范围的段落属性的NS😍raphStyle对象。
属性固定确保每个段落中只有一个NS😍raphStyle对象与字符相关。

段落属性包括对齐、制表符、换行模式和行距(也称为前导)等特征。
文本应用程序的用户通过标尺视图控制段落属性,由NSRulerView类定义。

有关段落属性的更多详细信息,请参阅 标尺和段落样式编程主题


4、雕文属性

字形是文本系统在显示器上实际绘制的字符的具体表示。
字形属性不像字符属性那样是复杂的数据结构,而是布局管理器用来表示渲染期间对特定字形的特殊处理的简单整数值。

文本系统很少使用字形属性,应用程序应该没有什么理由关注它们。
尽管如此,NSLayoutManager提供了处理字形属性的公共方法,因此您可以在必要时使用子类来扩展处理自定义字形属性的机制。

字形生成器在排版过程中根据字形的需要设置内置的字形属性。
在此过程中,它们被维护在布局管理器的字形缓存中,但它们不会永久存储。
字形属性的两个示例是用于布局完全对齐的文本的空格弹性属性和NSGlyphAttributeInscribe属性,用于在字体不包含内置character-with-umlaut时在字符上绘制变音符号等情况。

有关字形属性的详细信息,请参阅NSLayoutManager参考留档,其中描述了setIntAttribute:value:forGlyphAtIndex:方法。


5、文档属性

文档属性与整个文档相关。
文档属性包括纸张大小、边距和视图缩放百分比等特征。
尽管文本系统没有内置机制来存储文档属性,但初始化方法,如initWithRTF:documentAttributes:可以填充NSDictioneObject对象,您提供的文档属性来自RTF流或超文本标记语言数据流。
相反,写入RTF数据的方法,如RTFFromRange:documentAttributes:,如果您将引用传递给包含它们的 NSDictioneObjectiveObject,则写入文档属性。

有关详细信息,请参阅 RTF文件和属性字符串以及NSAtovertedString Additions参考留档。


三、设置文本属性

NSTextView允许您通过各种方法以编程方式更改其文本的属性,这些方法大多继承自超类NSText。
NSTextView添加了自己的方法来设置用户键入的文本属性,将文本的基线偏移量设置为绝对值,以及调整字距和连词的使用。
大多数更改属性的方法被定义为操作方法,并适用于富文本视图的选定文本或键入属性,或纯文本视图中的所有文本。

NSTextView维护一组键入属性(字体、大小、颜色等),它适用于新输入的文本,无论是用户键入的还是作为纯文本粘贴的。
它会自动将键入属性设置为插入点前面的第一个字符的属性,如果插入点位于段落的开头,则设置为段落的第一个字符的属性,或者设置为所选内容的第一个字符的属性。
用户可以通过选择菜单命令和使用字体面板(字体窗口)等实用程序来更改键入属性。
您还可以使用setTypingAttributes:以编程方式设置键入属性,但除非创建子类,否则您很少会发现需要这样做。

NSText定义了动作方法superscript:subscript:unscript:,它们通过预定义的增量提高和降低文本的基线。
NSTextView通过定义raiseBaseline:lowerBaseline:动作方法,可以更好地控制文本的基线偏移量,每次调用时提高或降低文本一个点。


1、字距

NSTextView提供了方便的操作方法来调整字符之间的行间距。
默认情况下,NSTextView对象使用标准字距调整(由字体的AFM文件中的数据提供)。
turnOffKerning:消息会导致忽略此字距调整信息,并使用标称宽度显示选定的文本。
loosenKerning:tightenKerning:方法 调整选定文本的字距调整值,并useStandardKerning:重新建立默认字距调整值。

字距调整信息是一个字符属性,它存储在文本视图的NSTextStorage对象中。
如果您的应用程序需要比该类的方法更好地控制字距调整,您应该直接通过其超类NSMutableAttributedString定义的方法对NSTextStorage对象进行操作。
有关设置属性的信息,请参阅NSA的参考留档。


2、结扎

NSTextView对连字的支持为给定的字体和脚本提供了所需的最低连字。
特定字体和脚本所需的连字由为特定语言生成字形的机制决定。
一些脚本很可能根本没有连字——例如,英语文本不需要连字,尽管某些连字(如“fi”和“fl”)是可取的,并且在可用的情况下使用。
其他脚本,如阿拉伯语,要求某些连字必须可用,即使turnOffLigatures:消息 被发送到NSTextView。
其他脚本和字体具有标准连字,如果可用,则使用它们。
useAllLigatures:方法 扩展了连字支持,以包括给定脚本的每种字体中可用的所有可能连字。

连字符信息是存储在文本视图的NSTextStorage对象中的字符属性。
如果您的应用程序需要比此类方法更好地控制连字符的使用,您应该直接通过其超类NSMutableAttributedString定义的方法对NSTextStorage对象进行操作。
有关设置属性的信息,请参阅NSA的参考留档。


四、访问属性

属性字符串通过名称标识属性,在NSDictionary对象的属性名称下存储一个值,该对象又与NSRange相关联,该NSRange指示字典属性所应用的字符。
除了标准属性外,还可以将所需的任何属性名称值对指定给一系列字符。


1、检索属性值

对于不可变的属性字符串,您可以在创建字符串时分配所有属性。
在Java中,您可以使用构造函数。
在Objective-C中,您可以使用initWithString:attributes:等方法,它显式地采用名称-值对的NSDictionary对象,或者initWithString:,它不分配任何属性。
应用程序工具包对NSAttributedString的扩展添加了采用RTF文件或超文本语言标记文件的方法。
有关使用可变属性字符串分配属性的信息,请参阅 更改属性字符串。

要从任一类型的属性字符串中检索属性值,请使用以下任何方法:

  • attributesAtIndex:effectiveRange:
  • attributesAtIndex:longestEffectiveRange:inRange:
  • attribute:atIndex:effectiveRange:
  • attribute:atIndex:longestEffectiveRange:inRange:
  • fontAttributesInRange:
  • rulerAttributesInRange:

前两个方法返回给定索引处的所有属性,attribute:...方法返回单个命名属性的值。
Application Kit对NSAttributedString的扩展添加了fontAttributesInRange:rulerAttributesInRange:,它们分别返回定义为仅适用于字符或整个段落的属性。

前四个方法还通过引用返回属性的有效范围和最长有效范围。
这些范围允许您确定属性的范围。
从概念上讲,属性字符串中的每个字符都有自己的属性集合;然而,知道一系列字符上的属性和值何时相同通常很有用。
这允许例程以大于单个字符的块遍历属性字符串。
在检索有效范围时,属性字符串只是在其属性映射中查找信息,本质上是应用于请求索引的属性字典。
在检索最长有效范围时,只要属性值相同,属性字符串就会继续检查超过该基本范围的字符。
这种额外的比较增加了这些方法的执行时间,但保证了所请求属性的精确最大范围。


2、有效和最大范围

通过引用返回有效范围的方法不能保证返回属性应用的最大范围;它们只保证返回它们应用的某个范围。
实际上,它们将返回从属性字符串的内部存储机制中容易获得的任何范围,这可能取决于实现和对属性字符串的精确修改历史。

另一方面,通过引用返回最长有效范围的方法保证返回包含相关属性应用的指定索引的最长范围(受传入inRange:的参数值的限制)。
为了提高效率,inRange:参数应该尽可能小,以适合客户端感兴趣的范围。

当您按属性范围遍历属性字符串时,根据情况,任何一种方法都可能是合适的。
如果要对每个范围进行一些处理,并且您知道最终必须处理给定属性的完整范围,那么使用longest-effective-range变体可能更有效,这样就不必分段处理范围。
但是,您应该谨慎使用longest-effective-range方法,因为最长的有效范围可能很长——可能是文档的整个长度,如果inRange:参数不受限制的话。

下面的Objective-C代码片段根据有效范围以块的形式遍历属性字符串。
这里的虚拟分析器对象计算每种字体中的字符数。
只要检索到的有效范围不包括属性字符串的结尾,while循环就会继续进行,检索到的字体实际上刚刚超过了最新检索到的范围。
对于检索到的每个字体属性,分析器都会计算有效范围内的字符数。
在此示例中,连续调用attribute:atIndex:effectiveRange:可能会返回相同的值。

NSAttributedString *attrStr;
unsigned int length;
NSRange effectiveRange;
id attributeValue;length = [attrStr length];
effectiveRange = NSMakeRange(0, 0);while (NSMaxRange(effectiveRange) < length) {attributeValue = [attrStr attribute:NSFontAttributeNameatIndex:NSMaxRange(effectiveRange) effectiveRange:&effectiveRange];[analyzer tallyCharacterRange:effectiveRange font:attributeValue];
}

相反,下一个Objective-C代码片段根据每个字体的最大有效范围在属性字符串中前进。
在这种情况下,分析器计算字体变化,这可能不仅仅是通过检索有效范围来表示。
在这种情况下,while循环基于限制范围的长度,限制范围从属性字符串的整个长度开始,随着循环的进行而减少。
分析器记录字体变化后,限制范围将被调整以考虑检索到的最长有效范围。

NSAttributedString *attrStr;
NSRange limitRange;
NSRange effectiveRange;
id attributeValue;limitRange = NSMakeRange(0, [attrStr length]);while (limitRange.length > 0) {attributeValue = [attrStr attribute:NSFontAttributeNameatIndex:limitRange.location longestEffectiveRange:&effectiveRangeinRange:limitRange];[analyzer recordFontChange:attributeValue];limitRange = NSMakeRange(NSMaxRange(effectiveRange),NSMaxRange(limitRange) - NSMaxRange(effectiveRange));
}

请注意,第二个代码片段更复杂。
因为这一点,也因为attribute:atIndex:longestEffectiveRange:inRange:attribute:atIndex:effectiveRange:慢,您通常应该只在对您正在执行的工作绝对必要时使用它。
在大多数情况下,按有效范围工作就足够了。


五、更改属性字符串

NSMutableAttributedString声明了许多用于更改字符和属性的方法。
您必须注意不要在属性值传递给属性字符串后修改它们。
您可能还需要修复在修改属性字符串时可能引入的不一致。


1、修改属性

NSMutableAttributedString声明了许多用于更改字符和属性的方法,例如原语replaceCharactersInRange:withString:setAttributes:range:,或更方便的方法addAttribute:value:range:applyFontTraits:range:等等。

下面的示例说明了如何在属性字符串中为选定范围指定链接属性,在文本下划线,并将其涂成蓝色。
请注意您可以为链接属性定义任何您想要的值,在选择链接时由您来解释该值-请参阅 访问属性-但是,通常您使用字符串或URL。
有关beginEditingendEditing(如示例所示)作用的解释,请参阅 修复不一致。

NSMutableAttributedString *string; // assume string exists
NSRange selectedRange; // assume this is setNSURL *linkURL = [NSURL URLWithString:@"http://www.apple.com/"];[string beginEditing];
[string addAttribute:NSLinkAttributeNamevalue:linkURLrange:selectedRange];[string addAttribute:NSForegroundColorAttributeNamevalue:[NSColor blueColor]range:selectedRange];[string addAttribute:NSUnderlineStyleAttributeNamevalue:[NSNumber numberWithInt:NSSingleUnderlineStyle]range:selectedRange];
[string endEditing];

分配给属性字符串的属性值成为该字符串的属性,不应该被其他对象“在属性字符串后面”修改。
这样做会导致属性字符串的内部状态不一致。
这有两个主要原因:

  • 属性值如何通过属性字符串传播是不可预测的。
    如果您更改值,您可能编辑的属性字符串比您想象的要多。
    事实上,该值可能已复制到撤消堆栈或完全不同的文档中,等等。
  • 属性字符串对属性进行缓存和唯一化,假设属性值不改变。
    假设是isEqual:一旦设置了属性值,属性值上的hash不会改变。

如果您必须更改属性值,并且确保更改将应用于正确的范围,您可以采用两种策略:

  • 使用一个属性值,其isEqual:hash不依赖于您正在修改的值。
  • 使用间接:将属性值用作可以更改实际值的表的查找键。
    例如,这可能是拥有类似“样式表”的属性的适当方法。

2、修复不一致

所有更改可变属性字符串的方法都会正确更新字符和属性之间的映射,但更改后可能会出现一些不一致。
以下是属性一致性要求的一些示例:

  • 段落样式必须适用于整个段落。
  • 脚本只能分配支持它们的字体。
    例如,汉字和阿拉伯字符不能分配泰晤士报-罗马字体,必须重新分配支持这些脚本的字体。
  • 删除附件字符需要释放相应的附件对象,同样,删除附件对象需要从字符串中删除相应的附件字符。
  • 以粗体显示所有语言关键字的代码编辑应用程序可以在用户更改字体或编辑文本时自动分配此属性。

应用程序套件的扩展NSMutableAttributedString定义了在进行更改时修复这些不一致的方法。
这允许在低级别清理属性,隐藏更高级别的潜在问题,并在属性更改时提供非常干净的显示更新。
有四种修复属性的方法和两种分组编辑更改的方法:

  • fixAttributesInRange:
  • fixAttachmentAttributeInRange:
  • fixFontAttributeInRange:
  • fixParagraphStyleAttributeInRange:
  • beginEditing
  • endEditing

第一个方法fixAttributesInRange:调用其他三个fix...方法分别清理已删除的附件引用、字体属性和段落属性。

NSMutableAttributedStringNSMutableAttributedString的子类重写提供beginEditingendEditing方法。
这些方法允许子类的实例记录或缓冲更改组,并在接收到endEditing消息时清理自己。
endEditing方法还允许接收者通知任何观察者它已被更改。
NSTextStorageendEditing实现,例如,修复更改的属性,然后通知其布局管理器他们需要重新布局并重新显示他们的文本。
默认实现什么都不做。


六、纯文本和富文本对象

文本对象(如NSText和NSTextView)可以包含纯文本或富文本。
纯文本对象只允许一组文本属性用于它们的所有文本;富文本对象允许为不同的字符集和段落设置多种字体、大小、缩进和其他属性。
您可以使用setRichText:方法控制文本对象是纯文本还是富文本。
富文本对象还允许用户将图像和文件拖入其中。
此行为由setImportsGraphics:方法控制。

一个富NSText对象可以使用RTF(富文本格式)作为交换格式。
但是,并非所有RTF控制字都受支持。
在输入时,NSText对象会忽略它无法识别的任何控制字;其中一些它可以读取和解释,但它不会写出。
表1列出了任何文本对象都可以识别的RTF控制字。
子类可能会识别更多。


Table 1 RTF control words recognized by all text objects

Control wordCan be written out
\ansiyes
\byes
\cbyes
\cfyes
\colortblyes
\dnnyes
\finyes
\fnyes
\fonttblyes
\fsnyes
\iyes
\linyes
\margrnyes
\paperwnyes
\macno
\marglnyes
\paryes
\pardno
\pcano
\qcyes
\qlyes
\qryes
\snno
\tabyes
\upnyes

七、RTF文件和属性字符串

富文本格式(RTF)是微软公司设计的一种文本格式语言。
您可以使用带有穿插RTF命令、组和转义序列的纯文本来表示字符、段落和文档格式属性。
RTF被广泛用作文档交换格式,用于跨应用程序和计算平台传输文档及其格式信息。
Apple使用自定义命令扩展了RTF,本章将对此进行描述。


1、读写RTF数据

Application Kit对NSAttributedString的扩展增加了对读取和写入许多流行文档格式的支持,包括RTF和RTFD,如 属性字符串编程指南 中的格式化文档和属性字符串中所述。
尽管NSAttributedString具有读取和写入RTF和RTFD数据的便利方法,但这些方法与通用方法相比没有优势,并且它们缺少有用的error:参数。


2、苹果的RTF扩展

Apple已经扩展了RTF语言,以支持Cocoa文本系统中可用的文本属性和格式结构,但不能用标准RTF表示。
Apple扩展采用与标准RTF命令、组和转义相同的形式。
RTF命令由一个反斜杠后跟一串字母字符(区分大小写),后跟一个可选的整数参数值组成,该参数值可以是正的或负的。
RTF组以左大括号({)开头,然后是RTF序列,可选地包括其他组,由右大括号(})关闭。
RTF转义由一个反斜杠后跟一个特殊字符组成,例如\{,它表示文字左大括号而不是组的开头。

RTF包含目标的概念,它是一个包含RTF命令和可能插入文档中不同位置的文本的组,例如脚注。
转义序列\*表示不理解后面命令的RTF阅读器应该忽略目标的内容。

RTF中的维度以twips表示——一个twip是一个点的二十分之一。

表1列出了Apple的字符属性RTF扩展。


Table 1 Character attribute RTF extensions

RTF序列描述参数
\CocoaLigatureN结扎控制NSLigatureAttributeName的价值。
0=无连字,1=默认连字,2=所有连字。
默认值1。
\expansionN要应用于字形的扩展因子2000*NSExpansionAttributeName值(扩展系数对数)。
默认值0。
\obliquenessN要应用于字形的倾斜2000*NSObliquenessAttributeName价值。
0=无歪斜。
默认值0。
\fsmliN更精细的字体大小规范1000*字体大小。
\fs 不是整数或半点值时,在 \fs 之外写入;值被\fs覆盖,因此应立即写入\fs 之后。
默认由 \fs 驱动。
\shadxN, \shadyN阴影偏移,与\shad一起编写X和Y偏移以twips为单位(0=无偏移)。
默认值为 \shadx3\shady-3
\shadrN阴影模糊,与\shad一起编写模糊半径(以twips为单位)。
0=无模糊。
默认值0。
\strikecN删除线颜色色号。
默认与前景文本颜色相同。
\strikestyleN删除线样式,写在 \strike, \striked, \strikew 不充分的地方样式和图案蒙版,NSObliquenessAttributeName 值。
0=无;0x8000=按字;样式:1=单,2=厚,9=双;图案:0x100=虚线,0x200=破折号,0x300=破折号,0x400=破折号点。
默认值0。
\strokecN描边颜色色号。
默认与前景文本颜色相同。
\strokewidthN字形笔画宽度,与\outl 结合编写。20*笔画宽度占字体点大小的百分比。
0=无笔画。
默认值0。
负值表示字形既被描边又被填充;笔画宽度取自参数的绝对值。
\ulstyleN下划线样式,写在标准 \ul 命令不够的地方样式和图案蒙版,NSUnderlineStyleAttributeName值。
0=无;0x8000=按字;样式:1=单,2=厚,9=双;图案:0x100=虚线,0x200=破折号,0x300=破折号,0x400=破折号点。
默认值0。
{{\NeXTGraphic attachment \widthN \heightN} string}与RTF文件位于同一文件夹中的附件文件名称(通常打包在RTFD文档中)附件是附件文件名,以UTF-8编码并正确RTF转义。
宽度和高度参数可选择以twips为单位指定附件大小。
字符串始终为0xAC。
{{}{\*\glidN basestring}string}明确指定字形的字形ID。
(额外的 {} 对在OS X 10.2及更早版本中围绕RTF阅读器bug工作是必要的。)
字形标识符(\gid 的参数)。
basestring是字形id要覆盖的字符串;然后将此属性应用于指定的字符串。
通常字符串和basestring是相同的,尽管字符串可能包含多个basestring实例。
{{}{\*\glidN basestring\glcolN} string}明确指定字形的字形ID字符标识符(\gid 的参数)和字符集合(\glcols的参数)。
集合ID:0=身份,1=Adobe CNS1,2=Adobe GB1,3=Adobe日本1,4=Adobe日本2,5=Adobe韩国。
{{}{\*\glid basestring\glnam glyphname}string}明确指定字形的字形ID字形名称是UTF-8编码中的字形名称。
\AppleTypeServicesUN字符形状控制NSCharacterShapeAttributeName的价值。
该值被解释为Apple Type Services k表征形状选择器+1。
值0禁用此属性。
默认值0。

表2列出了Apple的段落属性RTF扩展。

Table 2 Paragraph attribute RTF extensions

RTF序列描述参数
\pardeftabN段落的默认制表符间隔选项卡间隔值(以twips为单位)。
0=除了明确指定的选项卡之外,没有其他选项卡。
默认值0。
\qNatural段落的自然文本对齐方式(基于脚本),与\ql一起编写一个都没有
\sltraingN段落行距方法行间距值(以twips为单位)。
默认值为0。
\slmaximumN最大行高(NS段落样式最大行高方法),与\sl一起编写,如果需要\slmult以twips为单位的最大行高度值。
默认值为0,表示没有最大值。
\slminimumN最小行高(NS段落样式最小行高方法),与\sl和如果需要\slmult 一起编写最小行高值(以twips为单位)。
默认值为0。

表3列出了Apple的文档属性RTF扩展。

able 3 Document attribute RTF extensions

RTF序列描述参数
\readonlydocN只读文档。
这与文件系统权限或文件所有权无关;这只是一个提示,指示文档应该以只读方式呈现给用户,如果查看器或编辑器有能力的话。
0=非只读,1=只读。
默认值0。
\cocoartfNCocoa RTF写入器版本号。
这是Apple用来表示用于编写此文档的RTF写入器的版本号的数字。
递增版本号。
0=非Cocoa写入器,1=NextStep,40=OpenStep,100=OS X v10.0,102=10.2。
(除了递增未来版本的数字,不应该假设数字将来会如何变化。)默认值0,尽管一些启发式方法用于识别OS X之前的文档。
\viwhN, \viewwN用于显示文档的显示区域大小(不是窗口或视图大小)以twips为单位显示区域尺寸。
未指定默认值。

2024-06-16(日)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/356225.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VB.net实战(VSTO):VSTOwpf体验框架打包教程

如果是考虑到Wps用户较多&#xff0c;就不建议采用侧边栏的形式 只是个体验框架&#xff0c;界面未作美化&#xff0c;office的用户可以用任意一种窗体&#xff0c;喜欢那个界面就写那个界面&#xff0c;wps的侧边栏只能弹出一部分&#xff0c;每次需要的手动拖动。 打包了案例…

Linux测试服务器端口是否打开

前言 服务器端口在计算机网络通信中扮演着至关重要的角色&#xff0c;其作用可以归纳如下&#xff1a; 区分不同的应用程序或服务&#xff1a; 服务器端口用于标识和定位不同应用程序或服务在服务器上的通信入口。 通过不同的端口号&#xff0c;服务器可以同时运行多个应用程…

自动化测试:Autorunner的使用

自动化测试&#xff1a;Autorunner的使用 一、实验目的 1、掌握自动化测试脚本的概念。 2、初步掌握Autorunner的使用 二、Autorunner的简单使用 autoRunner使用方法 新建项目 a) 在项目管理器空白区域,右键鼠标,选择新建项目 b) 输入项目名后,点击[确定]. 在初次打开aut…

gitblit git pycharm 新建版本库及push备忘

在终端l中输入ssh,如果有消息弹出说明安装成功。 // 在任意路径打开GIT BASH,执行以下命令,期间所有询问可以直接Enter跳过 ssh-keygen -t rsa -C "注册Gitlab的邮箱" “”之内可以任何文字,备注提示作用。 设置用户名和邮箱 已经设置的可以检查一下。 #设置用…

Unity的渲染管线

渲染管线 概念 Unity的渲染管线是在图形学渲染管线的基础上&#xff0c;加上了高度可配置可扩展的框架&#xff0c;允许开发者自定义渲染流程。 渲染管线&#xff08;渲染流水线&#xff09;概述&#xff1a;将数据分阶段的变为屏幕图像的过程。 数据指的是模型、光源和摄像…

利用LabVIEW和机器学习实现无规律物体识别

针对变化无规律的物体识别&#xff0c;LabVIEW结合机器学习算法提供了一种高效的解决方案。介绍如何使用LabVIEW编程实现此功能&#xff0c;包括所需工具包、算法选择和实现步骤&#xff0c;帮助开发者在无规律的复杂环境中实现高精度的物体识别。 1. 项目概述 无规律物体的识…

『FPGA通信接口』LVDS接口(2)硬件设计

文章目录 1.LVDS原理2.xilinx器件对于LVDS的支持3.LVDS信号PCB布线要求4.传送门 1.LVDS原理 如上图所LVDS的工作原理示意图&#xff0c;其Driver驱动器由一个恒流源是LVDS发送端&#xff08;通常为 3.5mA&#xff09;驱动一对差分信号线组成。驱动状态会翻转就产生正负电压的变…

全球与中国汽车加热器市场:增长趋势、竞争格局与前景展望

汽车加热器是指安装在车辆上提供温暖和调节车厢温度的装置&#xff0c;确保乘客在各种天气条件下的舒适度。这些加热器在寒冷天气下为窗户除霜、防止起雾和保持居住者舒适的环境方面发挥着至关重要的作用。此外&#xff0c;智慧加热控制和预测演算法的不断整合正在引起全球汽车…

【面试干货】抽象类的意义与应用

【面试干货】抽象类的意义与应用 1、为其他子类提供一个公共的类型2、封装子类中重复定义的内容3、定义抽象方法&#xff0c;子类虽然有不同的实现&#xff0c;但是定义时一致的4、示例代码 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在…

STM32硬件接口I2C应用(基于FT6336)

目录 概述 1 硬件介绍 1.1 ST7796-LCD 1.2 MCU IO与LCD PIN对应关系 1.3 MCU IO与Touch PIN对应关系 2 FT6336的寄存器 2.1 FT6336寄存器列表 2.2 寄存器功能介绍 3 STM32Cube控制配置I2C 3.1 软硬件版本信息 3.2 I2C参数配置 3.3 使用STM32Cube产生工程 4 HAL库…

C#修改 EXE 文件图标和 winForm 窗口图标

修改 EXE 文件图标 1.准备好图片&#xff0c;转换为 Icon 图片&#xff1b; 2.右键工程&#xff0c;选择属性&#xff1b; 3.选择 Icon 图标即可&#xff1b; 4.重新生成可执行文件&#xff0c;查看。 修改 winForm 窗口图标 1.选中 winForm &#xff0c;查看属性&#x…

你好,复变函数1.0

输入时用后缀&#xff0c;开头空格 #include <easyx.h> #include <stdio.h> #define PI 3.141592653589793 #define E 2.718281828459045 #define K (1.0 / 256.0) #define K_1 256.0 //#define LINE//决定函数是用线画还是用点画 struct C {double i;double r;…

Unity3d 游戏暂停(timeScale=0)引起的deltaTime关联的系列问题解决

问题描述 游戏暂停的功能是通过设置timeScale0实现的&#xff0c;不过在暂停游戏的时候&#xff0c;需要对角色进行预览和设置&#xff0c;为了实现这个功能&#xff0c;是通过鼠标控制相机的操作&#xff0c;为了使相机的操作丝滑&#xff0c;获取鼠标操作系数乘以Time.delta…

网络编程(TCP协议,UDP协议)

目录 网络编程三要素 IP IPv4 InetAddress类 端口号 协议 UDP协议 UDP协议发送数据 UDP协议接收数据 UDP的三种通信方式(代码实现) TCP协议 TCP通信程序 三次握手和四次挥手 练习 1、客户端:多次发送数据服务器:接收多次接收数据&#xff0c;并打印 2、客户端…

技术分享 | 基于 API 解析的 Python 爬虫

最近各大高校纷纷翻拍 Coincidence 抖肩舞&#xff0c;需要对这种流行现象进行数据分析。数据分析首先需要有数据&#xff0c;本文介绍了爬取 B 站相应视频的评论、弹幕、播放量、点赞数等数据的方法。爬虫有多种实现方法&#xff0c;大型的网络爬虫多基于成熟的爬虫框架&#…

SpringCloud 基于Nacos和Eureka 实现双注册双订阅

一、使用场景/原因 过渡期迁移: 当系统从一个服务注册中心迁移到另一个时&#xff0c;例如从 Eureka 迁移到 Nacos&#xff0c;可以在过渡期内同时使用两个注册中心&#xff0c;确保服务平稳迁移&#xff0c;逐步过渡&#xff0c;避免一次性切换带来的风险。 兼容性考虑: 不同的…

这款跨界的软件也是非常强大!更快, 更轻, 更丝滑!

在网络世界中&#xff0c;一个好的浏览器就像一艘快速的帆船&#xff0c;帮助我们更快地到达目的地。迅雷浏览器正是这样一艘帆船&#xff0c;它不仅能够快速地带领我们浏览信息&#xff0c;还能提供安全的下载体验&#xff0c;让我们的网络生活更加丰富多彩。 迅雷浏览器&…

Python | Leetcode Python题解之第172题阶乘后的零

题目&#xff1a; 题解&#xff1a; class Solution:def trailingZeroes(self, n: int) -> int:ans 0while n:n // 5ans nreturn ans

AI播客下载:Machine Learning Street Talk(AI机器学习)

该频道由 Tim Scarfe 博士、Yannic Kilcher 博士和 Keith Duggar 博士管理。 他们做了出色的工作&#xff0c;对每个节目进行了彻底的研究&#xff0c;并与机器学习行业中一些受过最高教育、最全面的嘉宾进行了双向对话。 每一集都会教授一些新内容&#xff0c;并且提供未经过滤…

VMware Workstation安装Windows Server2019系统详细操作步骤

虚拟机版本 VMware Workstation 16 Prp 16.2.5 build-20904516 实现操作 创建虚拟机 创建新的虚拟机 自定义->下一步 默认即可&#xff0c;下一步 稍后安装操作系统->下一步 按照图下所示选择好系统->下一步 设置好虚拟机名称和位置->下一步 默认即可&#xff0…