Apple - Text Attribute Programming Topics

news2024/11/26 22:26:13

本文翻译整理自: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(日)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

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…

C语言入门系列:可迁移的数据类型

文章目录 1&#xff0c;精确宽度类型(exact-width integer type)2&#xff0c;最小宽度类型&#xff08;minimum width type&#xff09;3&#xff0c;最快的最小宽度类型&#xff08;fast minimum width type&#xff09;4&#xff0c;可以保存指针的整数类型。5&#xff0c; …

云原生微服务开发日趋成熟:有效拥抱左移以改善交付

在软件工程和应用程序开发方面&#xff0c;云原生已经成为许多团队的常用术语。当人们调查云原生的世界时&#xff0c;他们经常会得出这样的观点&#xff1a;云原生的整个过程都是针对大型企业应用程序的。几年前&#xff0c;情况可能确实如此&#xff0c;但随着 Kubernetes 等…

Redis-使用 jedis 操作数据

文章目录 1、Jedis简介2、环境准备3、创建maven普通项目,导入如下依赖4、测试JAVA程序和Redis之间的通信 1、Jedis简介 "Jedis" 通常是作为 "Java Redis" 的缩写或简称来理解的。Java Embedded Data Structures Interface 表示 Java嵌入式数据结构接口 2、…

45、基于深度学习的螃蟹性别分类(matlab)

1、基于深度学习的螃蟹性别分类原理及流程 基于深度学习的螃蟹性别分类原理是利用深度学习模型对螃蟹的图像进行训练和识别&#xff0c;从而实现对螃蟹性别的自动分类。整个流程可以分为数据准备、模型构建、模型训练和性别分类四个步骤。 数据准备&#xff1a; 首先需要收集包…

C# 中的隐式和显式类型转换

当你需要转换值的类型时&#xff0c;可以使用类型转换。只有当你要转换的两种类型兼容时&#xff0c;才有可能。 当你收到错误“无法隐式将一种类型转换为另一种类型”时&#xff0c;说明你转换的两种类型不兼容。 int integer; // 声明一个名为 integer 的整型变量 integer …

【Gradio】如何设置 Gradio 数据框的样式

简介 数据可视化是数据分析和机器学习的关键方面。Gradio DataFrame 组件是一种流行的方式&#xff0c;在网络应用程序中显示表格数据&#xff08;特别是以 pandas DataFrame 对象的形式&#xff09;。 本文将探讨 Gradio 的最新增强功能&#xff0c;这些功能允许用户整合 pand…

解决vmware “处理器不支持 XSAVE。无法打开此虚拟机的电源。“

1,打开windows 10-11 的 虚拟机平台 选择 “开始”&#xff0c;输入“Windows 功能”&#xff0c;然后从结果列表中选择“打开或关闭 Windows 功能 ”。 在刚刚打开的 “Windows 功能”窗口中&#xff0c;找到“虚拟机平台 ”并将其选中。 选择“确定”。 可能需要重启电脑。…

节能减排如何替电子行业巨头降低成本

尖端科技与环境之间的矛盾&#xff0c;已经不再是科幻小说家笔下的虚构。 先进芯片制造从熔化硅开始&#xff0c;到使用大功率激光进行光刻&#xff0c;再到创造和维护真空状态&#xff0c;以及持续清洁工作&#xff0c;每一个环节都需要大量的电力支持。据统计&#xff0c;半…

在Windows上用MinGW编译OpenCV项目运行全流程

一、准备软件 OpenCV源码CMake工具MinGW工具链&#xff08;需要选用 posix 线程版本&#xff1a;原因见此&#xff09; 二、操作步骤 官网提供了VC16构建版本的二进制包&#xff0c;但是没有给出GCC编译的版本。所以如果使用MinGW进行构建&#xff0c;那就只能从源码开始构建…

聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例

前言 dynamic 是一种有别于传统变量类型的动态类型声明&#xff0c;刚开始接触可能在理解上会有些困难&#xff0c;可以简单地把它理解为一个盲盒&#xff0c;你可以任意猜测盒子有什么东西&#xff0c;并认为这些东西真正存在而进行处理&#xff0c;等到真正打开时&#xff0…

【尚庭公寓SpringBoot + Vue 项目实战】预约看房与租约管理(完结)

【尚庭公寓SpringBoot Vue 项目实战】预约看房与租约管理&#xff08;完结&#xff09; 文章目录 【尚庭公寓SpringBoot Vue 项目实战】预约看房与租约管理&#xff08;完结&#xff09;1、业务说明2、接口开发2.1、预约看房管理2.1.1.保存或更新看房预约2.1.2. 查询个人预约…

mysql的安装以及分享navicat for MySQL

前言 根据网上分享的安装方法以及自己遇到的问题解决方法 一、mysql是什么&#xff1f; mysql 是一个开放源码的小型关联式数据库管理系统 二、安装过程 1.下载安装包 下载地址&#xff1a;MySQL :: Download MySQL Community Server 跳过直接下载&#xff0c;解压即可 …

10.华为路由器使用ospf动态路由连通两个部门网络

目的&#xff1a;实验ospf动态路由协议连通A与B部门 AR1配置 [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [Huawei]vlan batch 10 [Huawei]int Vlanif 10 [Huawei]int e0/0/0 [Huawei-Ethernet0/0/0]port link-type access [Huawei-Ethernet0/0/0]por…

Spring Bean 生命周期详解

Spring Bean 生命周期详解 在 Spring 框架中&#xff0c;Bean 的生命周期由 Spring 容器全权管理。了解和掌握 Bean 的生命周期对于使用 Spring 开发稳定且高效的应用程序至关重要。本文将详细介绍 Spring Bean 生命周期的五个主要阶段&#xff1a;实例化、属性注入、初始化、…

Avue-data数据大屏显示饼图(附Demo)

目录 前言1. Sql查询2. 颜色细节 前言 对于这部分知识&#xff0c;原先有过柱状图实战&#xff1a;Avue-data数据大屏显示柱状图&#xff08;附Demo讲解&#xff09; 以下直奔主题&#xff0c;以Sql数据库数据为主 1. Sql查询 以饼图为例&#xff0c;需要返回的形式如下&am…

在敏捷项目管理中实施 Scrum 方法

在本文中&#xff0c;我将阐明敏捷项目管理中的 Scrum 流程。我将深入探讨 Scrum 方法论中不可或缺的角色。本文将全面概述敏捷开发中的 Scrum 流程。我将解释 Scrum 的核心组件&#xff0c;详细探索端到端 Scrum 流程。在本文结束时&#xff0c;您将清楚地了解 Scrum 的工作原…

Ant Design Vue Cascader 级联选择 错位问题

当Cascader 多个的时候 对应的下列会错位 如果滚动 他不会跟着元素 而是会跟着屏幕滚动&#xff0c;如下效果 解决方法 在Cascader 标题添加 getPopupContainer 属性监听对应的位置&#xff0c;返回对应的元素 <a-cascader class"smart-width-100 " v-model:…

QThread 与QObject::moveToThread在UI中的应用

1. QThread的两种用法 第一种用法就是继承QThread&#xff0c;然后覆写 virtual void run()&#xff0c; 这种用法的缺点是不能利用信号槽机制。 第二种用法就是创建一个线程&#xff0c;创建一个对象&#xff0c;再将对象moveToThread, 这种可以充分利用信号槽机制&#xff…

Android-Android Studio-FAQ

1 需求 2 接口 3 Android Studio xml布局代码补全功能失效问题 最终解决方案就是尝试修改compileSdk 为不同SDK版本来解决问题&#xff0c;将原本34修改为32测试会发现xml代码补全功能有效了&#xff01; 参考资料 Android Studio xml布局代码补全功能失效问题_android studi…