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:NSFontAttributeName
        atIndex: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:NSFontAttributeName
        atIndex:limitRange.location longestEffectiveRange:&effectiveRange
        inRange: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 set
 
NSURL *linkURL = [NSURL URLWithString:@"http://www.apple.com/"];
 
[string beginEditing];
[string addAttribute:NSLinkAttributeName
               value:linkURL
               range:selectedRange];
 
[string addAttribute:NSForegroundColorAttributeName
               value:[NSColor blueColor]
               range:selectedRange];
 
[string addAttribute:NSUnderlineStyleAttributeName
               value:[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(日)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

音视频开发—FFmpeg 打开摄像头进行RTMP推流

实验平台&#xff1a;Ubuntu20.04 摄像头&#xff1a;普通USB摄像头&#xff0c;输出格式为YUV422 1.配置RTMP服务器推流平台 使用Nginx 配置1935端口即可&#xff0c;贴上教程地址 ubuntu20.04搭建Nginxrtmp服务器) 2.配置FFmpeg开发环境 过程较为简单&#xff0c;这里不…

【龙晰 离线安装openssl-devel】openssl-devel rpm 离线安装 需要下载哪些安rpm 包

进入龙晰镜像源地址下载 http://mirrors.openanolis.cn/anolis/8/BaseOS/x86_64/os/Packages/(base) [rootAI lib64]# yum install openssl-devel Last metadata expiration check: 14:03:32 ago on Fri 21 Jun 2024 07:26:56 AM CST. Dependencies resolved. Package …

不服 GPT-4o ,就是干?

OpenAI 最大的对手 Anthropic &#xff0c;深夜发布了他们迄今为止最智能的模型&#xff1a;Claude 3.5 Sonnet。 这俩家公司的竞争愈演愈烈&#xff0c;Anthropic 声称新 Claude AI 超越了 GPT-4o。 通过 Anthropic 发布的测试报告来看&#xff0c;新模型在推理、知识储备、代…

怎么处理整合了shiro的应用的RPC接口鉴权问题

这篇文章分享一下&#xff1a;当一个服务提供者整合了shiro安全框架来实现权限访问控制时&#xff0c;服务消费者通过feign请求服务提供者的接口时的鉴权不通过问题。 问题描述 博主有一个项目pms&#xff08;权限管理系统&#xff09;&#xff0c;使用了shiro框架来实现鉴权功…

什么是局域网IP?

局域网IP&#xff08;Local Area Network IP&#xff09;指的是在局域网内使用的IP地址。局域网是指在某个地理区域内&#xff0c;由一组相互连接的计算机组成的小型网络&#xff0c;常见于家庭、学校、办公室等场所。局域网IP可以用来实现内网穿透&#xff0c;即在复杂的网络环…

http发展史(http0.9、http1.0、http1.1、http/2、http/3)详解

文章目录 HTTP/0.9HTTP/1.0HTTP/1.1队头阻塞&#xff08;Head-of-Line Blocking&#xff09;1. TCP 层的队头阻塞2. HTTP/1.1 的队头阻塞 HTTP/2HTTP/3 HTTP/0.9 发布时间&#xff1a;1991年 特点&#xff1a; 只支持 GET 方法没有 HTTP 头部响应中只有 HTML 内容&#xff0…

2.XSS-存储型

储存型XSS 或持久型 XSS 交互的数据会被存在在数据库里面,永久性存储,具有很强的稳定性。 在留言板里面进行测试一下是否有做过滤 "<>?&66666点击提交 查看元素代码&#xff0c;已经提交完成&#xff0c;并且没有做任何的过滤措施 接下来写一个javascrip…

2024年十大数据集成工具和软件应用场景解析

详细阐述了十大数据集成工具及其优缺点&#xff1a; 数据集成的挑战 在当今的商业环境中&#xff0c;企业常常面临着数据分散、系统孤立的难题。传统的数据集成方式&#xff0c;就像一张复杂的蜘蛛网&#xff0c;难以理顺&#xff0c;令人头痛不已。 数据孤岛: 各个业务系统独立…

使用Jetpack Compose为Android App创建自定义页面指示器

使用Jetpack Compose为Android App创建自定义页面指示器 在现代移动应用中&#xff0c;页面指示器在提供视觉导航提示方面发挥着重要作用&#xff0c;帮助用户理解其在应用内容中的当前位置。页面指示器特别适用于顺序展示内容的场景&#xff0c;如图片轮播、图像库、幻灯片放…

在自托管基础设施上使用 GitOps 部署 MinIO

基于MinIO Weaviate Python GitOps探索的见解&#xff0c;本文探讨了如何增强软件部署流程的自动化。 通过将 GitHub Actions 与 Docker Swarm 集成而产生的协同作用&#xff0c;以自托管基础架构的稳健性为基础&#xff0c;标志着 CI/CD 实践的关键进步。这种方法不仅利用了软…

Mybatis缓存测试

实体类 Student Data Table(name "student") public class StudentEntity implements Serializable {private static final long serialVersionUID 1L;IdColumn(name "id")private Long id;Column(name "name")private String name;Column…

网络爬虫设置代理服务器

目录 1&#xff0e;获取代理 IP 2&#xff0e;设置代理 IP 3. 检测代理 IP 的有效性 4. 处理异常 如果希望在网络爬虫程序中使用代理服务器&#xff0c;就需要为网络爬虫程序设置代理服务器。 设置代理服务器一般分为获取代理 IP 、设置代理 IP 两步。接下来&#xff0c;分…

【STM32--Cortex-M3】

STM32-Cortex-M3 ■ Cortex-M3 处理器内核到基于Cortex-M3的MCU■ ARM的各种架构版本■ 指令集■ Cortex-M3简介■ Cortex-M3寄存器组■ Cortex-M3■ Cortex-M3■ Cortex-M3 ■ Cortex-M3 处理器内核到基于Cortex-M3的MCU Cortex-M3处理器内核是单片机的中央处理单元&#xff…

JDK18特性

JDK18特性 一、JAVA18概述 Java 18 在 2022 年 3 月 22 日正式发布,Java 18 不是一个长期支持版本,这次更新共带来 9 个新功能。 https://openjdk.org/projects/jdk/18/ 二、具体新特性 1. 默认UTF-8字符编码 JDK 一直都是支持 UTF-8 字符编码,这次是把 UTF-8 设置为了默…

RPM 打包入门(基于openEuler)

主要参考内容&#xff08;均为官方文档&#xff09;&#xff1a; https://rpm-packaging-guide.github.io/#building-rpms https://docs.redhat.com/zh_hans/documentation/red_hat_enterprise_linux/8/html/packaging_and_distributing_software/introduction-to-rpm_packagin…

Opencv学习项目5——pyzbar,numpy

上一次我们使用pyzbar进行解码二维码并将其内容显示在图像上&#xff0c;使用的是rect barcode.rect来获取图像的坐标&#xff0c;这次我们使用另一种方法来获取坐标进行画框。 Numpy介绍 NumPy 是一个用于科学计算的开源 Python 库&#xff0c;提供了对大量数值数据进行高效操…

Java学习笔记(一)Java内容介绍、程序举例、DOS命令、Java跨平台特性的本质

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍Java内容介绍、程序举例、DOS命令、Java跨平台特性的本质详细介绍以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言 目录 1、内容介绍…

STM32项目分享:家庭环境监测系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板打样焊接图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.…

数据可视化实验四:Pyecharts数据可视化

目录 一、使用PyEcharts绘制全国肺炎确诊人数分布图 1.1 柱状图 1.1.2 代码实现 1.1.2 绘制结果 1.2 饼状图 1.2.1 代码实现 1.2.2 绘制结果 1.3 使用over lap实现图形叠加 1.3.1 代码实现 1.3.2 绘制结果 1.4 地图绘制-Map 1.4.1 代码实现 1.4.2 绘制结果 1.5 地…

ECharts 词云图案例二:创意蒙版应用

ECharts 词云图案例二&#xff1a;创意蒙版应用 引言 在数据可视化领域&#xff0c;ECharts 以其强大的功能性和灵活性&#xff0c;成为开发者和设计师的首选工具之一。继上一篇关于 ECharts 词云图的详细介绍后&#xff0c;本文将探索词云图的进阶应用——使用蒙版来创造更具…